记录下自己之前不太清楚或者已经忘记的知识。
1.boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true or false.
JAVA中没有bool类型。
除此之外java中所有基本类型所占存储空间的大小是不变的,这种不变性是JAVA更高可移植性的原因之一。
char 16 bit
byte 8
short 16
int 32
long 64
float 32
double 64
尤其要注意float的32位是怎么表示数据的值的。
float:
1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) 指数位是按补码的形式来划分的。(顺带回忆下补码原码的转换)2.BigInteger支持任意精度的整数,可以准确表示任何大小的整数而不丢失任何信息。
BigDecimal支持任何精度的定点数,可以用来进行精确的货币计算。
3.main函数的参数args用来存储命令行参数
4. |和||,&和&&
|和&不短路,进行所有的判断。 如果是进行位运算,返回的是数值, 布尔运算是返回true/false。
5.<< >> >>>
<<低位补0,>>若符号为正高位补0,为负补1, >>>无论正负都补0
6.对象调用方法时会把自己的引用作为第一个参数传过去。
7.JAVA中的垃圾回收装置
判断对象是否还存活的算法(两种,优缺点),回收的方法(优缺点)
书上说的挺清楚,有篇博客也不错。http://blog.csdn.net/stypace/article/details/41441389
8.构造器初始化的顺序
参考http://blog.csdn.net/mad1989/article/details/20793539
1,首先会执行类中static代码块(不管代码块是否在类的开头还是末尾处),如果这个类有父类,同样会优先查找父类中的static代码块,然后是当前类的static。
2,然后会从父类的第一行开始执行,直至代码末尾处,中间不管是有赋值还是method调用,都会按顺序一一执行(method),普通代码块{ }...
3,其次才是父类的构造函数,执行带参数或不带参数的构造函数,依赖于实例化的类的构造函数有没有super父类的带参或不带参的构造函数,上边试验二三已经证明。
4,然后会从子类(当前类)的第一行开始执行,直至代码末尾处,中间不管是有赋值还是method调用,都会按顺序一一执行(method),普通代码块{ }...
5,其次会是子类(当前类)的构造函数,按顺序执行。
6,最后是类方法的调用执行,如果子类覆盖了父类的method,执行时会先执行子类覆盖的method,method内如果有super.method(),才会调用父类的同名method,否则不会。
9.可变参数
如String...strings传进来的是strings[]
10.向上转型
调用 需要父类对象作为参数的方法 时传递子类对象, 那个方法里会把子类对象的引用转换为父类对象的引用,成为向上转型。
11.使用final关键字
数据、方法、类
数据:
static+final: 编译时常量,编译器把值代入用到的计算式中,在编译时执行计算式,减轻运行时负担。这类常量必须是基本数据类型,定义时要赋值。
对对象使用final时,使引用恒定不变,该引用不能被指向别的对象。但对象值可以被修改。数组也同样适用,数组也是对象。
如果在定义时没有赋值,要在类的所有构造函数中有赋值语句。
final参数则在方法中不能改变。
方法:
防止子类覆盖
给private方法加final并没有实际意义,因为private方法本身就不能被子类覆盖。
类: 防止被继承
12. 类的加载发生在创建类的第一个对象时,或者是访问static域/调用static方法时。定义为static的东西只能被初始化一次。
13.finalize方法
一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
但finalize()方法并不等于C++中的析构函数,不该将finalize()作为通用的清理方法。垃圾回收只与内存有关。使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。
之所以要有finalize(),是因为在分配内存时可能采用了类似C语言中的做法,而非JAVA中的通常做法,这种情况主要发生在使用本地方法的情况下。(native 方法)
如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。而且绝对不能直接调用finalize()。 (这个我不明白为什么,对于finalize以后还要更深入的去研究)