终于忙完项目了…开始暑假学习。
一切都是对象。
尽管一切都看作对象,但是操纵的标识符实际上是对对象的一个“引用
”。
可以将这一切情形想象成用遥控器(引用
)来操作电视机(对象
)。 当有人想改变频道或减小音量时,实际操控的是遥控器(引用),再由遥控器来调控电视机(对象)。
即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不一定需要要有一个对象与它关联。
String s;
//这里创建了一个String引用,并不是对象
//此时s实际上没有与任何事物相关联,如果向s发送一个消息,就会返回一个运行时错误
//因此最好在创建一个引用时同时对它进行初始化
通常用new
操作符来让引用与一个新的对象相关联。
String s = new String("ahgh");
程序运行时,对象是怎么防止安排的呢?尤其是内存是怎么分配的呢?有五个地方储存数据
- 寄存器:位于处理器内部。因为寄存器数量有限,所以它根据需求进行分配,你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
- 堆栈:位于
通用RAM(随机访问储存器)
,通过堆栈指针
可以从处理器哪里获得直接支持。堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。创建程序时,Java系统必须知道储存在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。(这一约束也限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中----特别是对象引用,但Java对象并不储存在其中。) - 堆:一种通用的内存池(也位于RAM区),用于存放所有Java对象。堆不同于堆栈的好处:编译器不需要知道存储的数据在堆里存活的时间。(因此具有灵活性)。但是用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
- 常量存储:常量值通常直接放在程序代码内部。有时,在嵌入式系统中,常量本身会和其他部分分隔开,所以在这种情况下,可以选择将其存放在ROM(只读存储器器)中。
- 非RAM存储:如果数据完全存活在程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。例如
流对象
和持久化对象
。在流对象中,对象转化成字节流,通常被发给另一台机器。在持久化对象中,对象被存放在磁盘中。这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时可恢复成常规的,基于RAM的对象。
对于基本类型,Java采用创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中。
Java确定每种基本类型所占据的存储空间的大小,占据的存储空间的大小的不变性是Java比其他语言更具有移植性的原因之一。
所有的数值类型都具有正负号。
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用了表示对应的基本类型
。
高精度数字:
两者都没有对应的基本类型
作用域决定了在其内定义的变量名的可见性和生命周期。
Java对象不具备和基本类型一样的生命周期,当用new
创建一个Java对象时,它可以存活于作用域之外。
Java有垃圾回收器
来监视new创建的所有对象,并辨别哪些不会再被引用的对象,随后释放这些对象的内存空间,这样就不用担心内存回收的问题。(消除内存泄漏的问题,通常由程序员忘记释放内存而产生的。)
如果你采用代码,引用s在作用域的终点就消失了,但
s指向的String对象仍继续占据内存空间
,只是在这个作用域之后无法访问这个对象。因为对它的唯一引用已超过作用域的范围
。
创建新的类型:类(class
关键词)
定义了一个类,就可以在类中设置两种类型的元素:字段(数据成员)和方法(成员函数)。
字段可以是任何类型的对象,可以通过引用与其进行通信,也可是基本类型的一种。
如果字段是对某个对象的引用,就必须初始化该引用,以便使其与与一个实际的对象相关联。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用
。
Java方法的参数列表中必须制定每个所传递对象的类型以及名字,这里传递的实际上也是引用
。
static关键字
通常来说,当创建类时,就是在描述那个类的对象的外观和行为。用new
创建才能获得那个类的对象,执行new
来创建对象时,数据存储空间才被分配,其方法才供外界调用。
引用static变量有两种方法:1.通过一个对象去定位
,入test1.i,也可以通过其类名直接引用
,如Test.i。
使用类名是引用static变量的首选方式,不仅强调了变量的static结构,而且在某些情况为编译器进行优化提供了更好选择。