Java基础备忘录
(mainly based on Van Der Linden's book: Just Java 2, 4ed)
- Object的方法
- public native int hashCode() 散列码是一个能够唯一的表示单个对象的值。最简单的是,采用对象的内存地址作为它的散列码。散列码用作HashTable 的key,从而使任何对象可以放入HashTable。
- public boolean equals(Object obj) 当重写自定义类的equals()时,也应当重写hashCode()方法以确保等价的对象能获取同一个散列码。如果不这样做,在操作Collection类中的某些数据结构时,自己的对象将会出现莫名其妙的错误。
- protected native Object clone() throws CloneNotSupportedException 为所有Java类提供默认的浅克隆实现,即:如果该类中含有其他对象的引用,则仅复制引用本身。而另一种递归克隆所有引用的克隆方式称为深层克隆(deep clone),实现deep clone需要重写类的clone()方法。
- 基本数据类型 (char, boolean, byte, short, int, long, float, double)
- 基本类型转型 时,不可直接将高精度类型(机器内占用位数多)赋给低精度类型,但对给char赋值的整数(int)例外。
- char a = 0x892; char b = 982; char c = (char)70000; //超出范围则需强制(显式)转型 char d = (char)-98; //Ridiculous, but legal
- char c = (char)(c+13);// the cast is required
- 总结:赋值时,如果=右边给一个确定的值,编译器可以检查出右操作数是否超出左操作数允许的范围,从而判断是否需要显式的转型;如果没有给一个确定的值,比如,包含运算(即使全是常量的运算),包含变量,则必须显式转型。
- char变量可以直接赋值到所有算术类型:byte, short, 【对前2个,超过2^15-1的数呢?】 int, long, float, double.
- 【char es = (byte)8;char es = 8;也都合法,解释理由:_______】
- Java中所有6种数字类型都是有符号数 ,最左边的位(最高有效位)表示符号,其余位表示值, 采用2的补数表示法,现代大部分CPU都是这样表示的【What? How? Why?】 。0被村委正的2进制数,因此整数最大数的绝对值比负数少1.【那么,对于byte: 10000000和11111111,各代表什么呢?】
- 为加速内存访问, Java采用字节(8位)存储每个布尔数 ,但在计算运行时,却不一定是这样(与虚拟机实现有关),例如,SUN的JVM会在把布尔值压入栈中时,将含它的字符(8位)提升到一个32位整数。至少,不要认为布尔值是个1位长的数据类型且会节省空间。【P28: 如果用户在欧洲国家使用计算机,Java将会自动地从16位转换到8位字符集。【HOW???如何手工转换呢?】
- Java支持16位Unicode字符集,
- 类的初始化顺序
对于 单独一个类 ,初始化的顺序是:
1. 静态变量
2. 静态初始化块
3. 非静态变量
4. 非静态初始化块
5. 构造函数
b) 在 父子继承关系中 的初始化顺序是:
1. 父类 -- 静态变量
2. 父类 -- 静态初始化块
3. 子类 -- 静态变量
4. 子类 -- 静态初始化块
5. 父类 -- 变量
6. 父类 -- 初始化块
7. 父类 -- 构造器
8. 子类 -- 变量
9. 子类 -- 初始化块
10. 子类 -- 构造器
11.
可见, 并不是父类完全初始化完毕后才进行子类的初始化 ,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。