Think in Java - Chatpter 2 一切都是对象
保存到什么地方?
特殊情况:主要类型
在程序设计时需要频繁使用它们。
之所以要特别对象,是由于用new创建对象(特别是小的,简单的变量)并不是非常有效,因为new将对象置于“堆”里。对于这些类型,Java采纳了与C和C++相同的方法。也就是说,不是用new创建变量,而是创建一个并非句柄的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效地存取。
?
能对int和float做的事情,对BigInteger和BigDecimal一样可以做。
只是必须使用方法调用,不能使用运算符。
?
Java 数组,可以保证被初始化,而且不可在它范围之外访问。
创建数组 - 实际创建的是一个句柄数据。
每个句柄数据会自动初始化一个特殊值,并带有自己的关键字null;一旦Java看到null,就知道该句柄并未指向一个对象,正是使用前必须为每个句柄分配一个对象。
?
Java如何帮我们完成所有的清除工作:
// 作用域 - 对于在作用域里定义的名字,作用域同时决定了:可见性和存在时间// 在C C++ Java里,作用域是由花括号的位置决定的{ int x = 12; /*only x available*/ { int q = 96; /*both x & q available*/ } /*only x available*/ /*q out of scope*/}{ String s = new String("a string");}/**句柄S会在作用域的终点处消失,然而,S指向的Sring对象依然占据着内存空间。结果:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。Java有一个特别的“垃圾收集器”,会自动查找用new创建的所有对象,并辨别其中哪些不在被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。*/?
?默认值
若某个主数据类型属于一个类成员,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值。
Boolen?? fasleChar?? ‘\u0000’ (null)byte?? (byte)0short?? (short)0int?? 0long?? 0Lfloat?? 0.0fdouble?? 0.0d这种保证并不适用于“局部”变量 -- 那些变量并非一个类的字段。
所以,假若在一个函数定义中写?
int = x;
那么x会得到一些随机值(这些和C C++是一样的),不会自动初始化为零。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。
?
?static关键字
只想用一个存储区域来保存一个特定的数据 - 无论要创建多少个对象,甚至根本不创建对象需要一个特殊的方法,没有与这个类的任何对象关联/**一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个 static方法,或访问一些 static数据。*/class StaticTest { Static int i = 47; } /**现在,尽管我们制作了两个StaticTest 对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。请考察下述代码: 此时,无论 st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。*/StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest(); ?
一个特殊的类库会自动导入每个Java 文件:java.lang。
由于 java.lang 默认进入每个Java 代码文件,所以这些类在任何时候都可直接使用。
在这个列表里,可发现System和Runtime,我们在Property.java 里用到了它们。
?
注释和嵌入文档
?
?
?
?
?
?
?
?