一、对象引用(Reference)
二、新建对象
- 既存型别
- 自定义型别
三、存储
- 寄存器:速度最快,位于处理器内部。但寄存器个数有限,由编译器根据本身的需求适当的分配使用,(对一个程序员来说)基本是一个感觉不到的存在。
- Stack(栈):位于一般的RAM(random-access memory,随机访问内存)中。处理器经由其指针提供直接的支持,分配新内存时指针后后移,释放内存时,指针前移。效率仅次于寄存器。Java编译器负责产生"控制指针移动"的程序代码,所以它必须能够完全掌握它所编译的程序中"存在stack里所有数据的实际大小和存活时间"。如此便限制了程序的弹性,也因此,我们只能将对象的reference存储于stack内,但却不能将一般的Java对象也置于其上。
- Heap(堆):Heap是一种通用性质的内存存储空间(存在RAM中),用来放置所有的Java对象,使用关键词new,便会自Heap分配空间。Heap分配的空间具有高度的弹性。但是从Heap分配空间比从stack分配所花费的时间多了不少。
- 静态存储空间(Static storage):存在于RAM里,该空间存放着"程序执行期间"一直存在的数据。使用关键词static,可以将某个对象内的特定成员设为静态,但Java对象本身绝无肯能置于静态存储空间中。
- 常量存储空间(Constant storage):常量值常会被直接置于程序代码里,也可以放到唯读内存(read-only memory,ROM)中。
- Non-RAM存储空间:若数据完全存活于程序之外,那么即使程序不执行,数据也能够继续存在,脱离程序的控制。streamed objects(串流化对象)和persistent objects(持久化对象)便是主要的两个例子。它们能够将对象转换为可存储与其他媒介的形式,并在必要时将所存储的数据还原成可存储与RAM中的一般对象。
四、基本型别(基本数据类型)
- 不使用new分配空间,产生一种变量(automatic),不是reference形式,此类变量直接存放数据值,并置于stack
- 每种基本型别都有其对应的外覆型别(包装类),用来操作由基本型别产生的对象,或用在Heap内产生代表该基本型别的非原始对象
五、高精度数值
- java.math.BigInteger:支持任意精度的整数
- java.math.BigDecimal:提供任意精度的定点数
六、Java中的数组
- Java语言的数组其实就是一块内存而已。Java保证数组一定会被初始化,而且程序员对数组的访问无法逾越范围(代价:每个数组得额外多出一点空间,并且得在执行时期对数组索引值进行检查)
- 当你产生某个存储对象的数组时,真实产生的其实是个存储references的数组。此数组建立后,其中每一个references皆会被自动设为某个特殊值。该值以关键字null表示。当Java看到null值时,便将这个referebnces视为"不指向任何对象"。使用任何reference之前,必须将某个对象指派给它,若某个reference的值为null,便会在执行期发生错误。数组也可以存储基本型别,编译器一样保证初始化动作的必然进行:这次它会将数组所占的内存全部清为零。
七、作用域(scope)
八、对象的生存周期
- 使用new来产生一个Java对象,即便离开了作用域(生存空间),该对象依然存在。
{ String s=new String(" a string"); }/*end of scope*/
2. s这个reference将在作用域之外消失,但是,s先前所指的那个String对象,仍然会继续占用内存。
3. 不过Java有所谓的"垃圾回收器(garbage collector)"机制,它会逐一检视所有通过new所产生的对象,并在这些对象不再被引用时,"垃圾回收器"便释放这些对象的内存。因此你
不必关心内存回收问题,只要关心对象的产生就好。所有对象,在你不需要的时候就会自动消失。
九、建立新的数据型别(class)
- 使用class关键字定义类
- 使用new关键字产生此类对象
十、数据成员(fields)和函数(methods)
- 数据成员可以是任何类型的对象,只要你通过reference来和它沟通就行。数据成员也可以是基本型别(不具备reference者)
- 每一个对象都持有用来存储数据成的空间;不同的对象彼此之间并不共享数据成员
- 基本成员(boolean,int...等基本型别)的缺省值
十一、方法,参数,返回值
十二、static关键字
- 无论产生了多少个对象,或不存在任何对象的情形下,那些特定数据的存储空间都只有一份(例:Java中的mian方法)
- 某个函数不要和class object绑在一起
- 可以通过对象来调用静态变量/方法
- 可以通过类名来调用静态变量/方法
class StaticTest{ static int i=0;
public static void main(Stringp[] args){
StaticTest st_1=new StaticTest();
StaticTest st_2=new StaticTest(); System.out.println(st_1.i==st_2.i); //true
System.out.println(st_1.i==StaticTest.i); //true
} }
十三、编译与执行
十四、注解及内嵌式文档
十五、javadoc
- Netbeans可以自动构建和官方文档相似的javadoc
十六、编码风格