第二章.一切都是对象
数据区 | 代码区 |
2.1用引用操纵对象:对于String s,创建了一个引用s,是String类型的,但是此时s并没有指向对象,必须还要创建对象,
2.2使用new关键字创建对象,String s =new String("csdn");表示有一个引用s指向了一个string类型的对象csdn;
2.2.1数据存储在什么地方:(1)寄存器:位于处理器内部,最快的存储区,但是它不能由程序员直接控制,由硬件控制,它是根据需求进行分配的;(2)堆栈:位于通用RAM,随机访问存储器,速度仅次于寄存器,通过堆栈指针的移动来控制内存的分配和释放,这一特性使得java必须知道存储在堆栈中的所有项的确切生命周期,以便上下移动指针,限制了程序的灵活性,所以java的对象不存储在这里,只有某些引用存储在堆栈中;(3)堆heap:一种通用内存池,位于RAM,存放了所有的java对象。当使用关键字new一个对象时,便会自动在堆中进行存储分配,编辑器不需要知道存储的数据在堆里存活多久,更加灵活,但是比起堆栈,存储分配时需要更长的时间。(4)常量存储:常量值通常直接存放在程序代码内部????,可以保证安全,因为它们永不改变。在嵌入式系统,可以放在ROM只读存储器。(5)非RAM存储: 数据没有放在内存,数据存活于程序之外,不受程序控制,在程序没有运行时也可以存在。例如,在持久化对象中,对象存放在磁盘。内存关系如上图。内存也是RAM,逻辑上分为数据区和代码区,程序运行时一定是在内存中的。堆栈和堆都是属于数据区的。(*********)
2.2.2特例:基本类型创建对象不需要new,它创建的是一个并非是引用的“自动”变量,这个变量直接存储值,并置于堆栈中,因此更加高效。java中每种基本类型所占空间大小是不变的,这也是其可移植性的原因之一。所有数值类型都有正负号。java提供了两个用于高精度计算的类:BigInteger和BigDecimal。
2.2.3数组:当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用会被自动的初始化为一个特定值,该值拥有自己的关键字null.如果试图使用一个还是null的引用,在运行时会报错。
2.3永远不需要销毁对象:java会替我们完成清理工作:
2.3.1作用域:花括号的位置决定作用域,在作用域里定义的变量只可用于作用域结束之前;
2.3.2对象的作用域:java对象不具有和基本类型一样的生命周期。当用new创建一个java对象时,它可以存活于作用域之外。例如,
{
String s=new String("a string");
}//end of the scope
引用s在作用域中点就消失了,但是s指向的String对象仍会占据内存空间,仍然可以继续使用。当不再使用时,系统会自动回收,无需考虑是否占用了内存。这就是“垃圾回收器”要做的事了。
2.4创建新的数据类型,类:class TypeName{/* class boby goes here */}
2.4.1字段和方法:在java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象。(***)
定义了类以后,就可以在类中定义两种类型的元素:字段(数据成员)和方法(成员函数)。字段可以是任何类型的对象,可以通过引用与它通信,也可以是基本类型的一种。
class DataOnly{
int i; //基本类型的对象
DataOnly data=new DataOnly(); //引用data指向一个DataOnly类型的对象
data.i=22; //引用一个对象的成员,同样的方法也可以引用一个对象的方法data.function();
}
对于上面的i,它是有默认值0的,因为它是作为类的成员;如果是在某个方法中定义变量i,没有初始化的情况下,可能是任意值,不会初始化为0。
2.5方法,参数和返回值:java方法决定了一个对象能够接受什么样的消息,方法的基本组成部分包括:名称,参数,返回值,方法体。
ReturnType methodName(参数类型 参数引用){
//方法体
}
方法名和参数列表唯一标示某个方法。java中的方法只能作为类的一部分来创建,方法只有通过对象才能被调用。
2.5.1参数列表:必须指定每个所传递对象的类型和名字,这里实际传递的也是引用,并且引用的类型必须正确。
int storage(String s){
return s.length()*2;
}
返回值类型要与int一致;如果返回类型时void,return关键字的作用只是用来退出方法。如果此方法产生一个值,要放在return后面。
2.6 构建一个java程序:
2.6.1名字可见性: 域名反转,com.package.name,类似的。
2.6.2运用其他构件:import指示编译器导入一个包,也就是类库。import java.util.ArrayList;import java.util.*;
2.6.3 static关键字 :当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何实例对象关联在一起,所以,即使没有创建某个类的对象,也可以调用其static方法或访问其static域。对于非static域和方法,必须创建对象才能访问。有时会用到类数据和类方法这两个术语,表示这些数据和方法只是作为整个类,而不是类的某个特定对象而存在。
class StaticTest{
static int i=47; //将字段设定为static
StaticTest st1=newStaticTest();
StaticTest st2=newStaticTest(); //即使创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享同一个i,具有相同的值47。因为static字段对每个类来说都只有一份存储空间,而非static字段对每个对象都有一份存储空间。
}
引用static变量有两种方法。通过一个引用定位它,如st1.i;使用类名是引用static变量的首选方式,StaticTest.i;
类似逻辑也适用于static方法。但是两种方法差别不大。static方法的一个重要用法就是在不创建任何对象的前提下都可调用它,这一点对于定义main()方法很重要,这个方法是运行一个应用时的入口,public static void main(String[] args){}。(***)
2.7你的第一个java程序:
import java.util.*; //java.lang是默认导入每个java文件的
public class HelloDate{
public static void main(String[] args){ //程序入口
System.getProperty().list(System.out); //system对象调用getproperty方法返回一个对象,这个对象又调用list方法,list方法的参数是system.out.(这行程序运行不了,有问题??????????????)
System.out.println(System.getProperty("user.name"));
System.out.println(System.getProperty("java.library.path"));
}
}
2.8注释和嵌入式文档:javadoc的使用?