接触Java已经四年了,可是一直觉得自己的知识比较散乱,也不是很扎实。往往是指其然,而不知其所以然。静下心来仔细想想,觉得原因主要有两点,一是自己不求甚解,觉得会用就行;二是缺少总结积累,没有把以前的经验教训记录下来。痛定思痛,我决定回到起点,从分析JDK源码开始,使自己对Java有一个新的认识。

由于本人水平有限,难免有很多错误,或分析的不够深入的地方,还请大家指正!

我用的JDK是1.6,先从最简单的java.lang.Boolean开始。

Boolean类是基本类型boolean的一个包装类,它包含了一个boolean类型的字段:
public final class Boolean implements java.io.Serializable, Comparable<Boolean>
{
    private final boolean value;
}
这是一个final类型的变量,因此一旦运行构造函数创建对象,它的值就无法更改。所以这个类是一个非可变类(对于非可变类的描述详见《Effective Java》第13条)

Boolean类有两个构造函数,允许使用boolean类型的变量或String值来创建对象,但并不推荐使用这两个构造函数。由于boolean只有true和false两种状态,所以Boolean类中提供了两个对应的静态变量:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
我们可以直接使用这两个对象,这样可以避免在内存中创建重复对象,也减少了相应的时间消耗,有可能显著的提高空间和时间性能。如:
Boolean var = Boolean.True;

如果我们需要根据一个boolean变量来创建一个对象时该怎么办呢,这时我们可以使用Boolean类提供的两个和构造方法相对应的工厂方法:
public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}
从代码中可以看出,工厂方法实际上并没有创建新的对象,而是返回上面所说的两个静态变量中的一个。

其余的几个方法比较简单,如:
public int hashCode() {
    
return value ? 1231 : 1237;
}
其中1231代表true,1237代表false。

public boolean equals(Object obj) {
    
if (obj instanceof Boolean) {
        
return value == ((Boolean)obj).booleanValue();
    } 
    
return false;
}

另外Boolean类实现了Comparable接口:
public int compareTo(Boolean b) {
    
return (b.value == value ? 0 : (value ? 1 : -1));
}

小结
  1. 对于状态有限的Java类,可以用几个final的静态变量来表示所有的状态实例。例如季节,可以在Season类中定义春、夏、秋、冬四个变量,用户可以直接调用Season.Spring。
  2. 访问静态实例还可以通过工厂方法来实现,如Boolean.valueOf(var)。