JDK1.7.0_45源码阅读<java.lang.Boolean>
本文适合的人群
其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间.
简要把内容在这里说一下(等会弄目录了,再改成目录方式吧)
- 对java.lang.Boolean的概况简单介绍.这里其实和看API差不多,而且没有API全.
- 我个人是如何理解java.lang.Boolean的
- 拆箱和装箱
我衷心的希望您能提出宝贵的意见,若文中有任何不妥非常希望能得到您的指正.
java.lang.Boolean主要概况
类描述
public final class Boolean implements java.io.Serializable,Comparable<Boolean>
成员变量
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static final Class<Boolean> TYPE = Class.getPrimitiveClass("boolean"); private final boolean value; private static final long serialVersionUID = -3665804199014368530L;
构造器
public Boolean(boolean value) { this.value = value; } public Boolean(String s) { this(toBoolean(s)); }
简单的理解源代码
从类描述中可以看到java.lang.Boolean使用了final关键字声明,并且仅有的5个成员变量也都使用了final关键字声明.因此
java.lang.Boolean 不允许继承并且一旦构造完毕,它的状态不可改变.
java.lang.Boolean类是基本类型boolean的包装类,既然是包装类那么java.lang.Boolean类中一定会包含一个boolean的基本类型成员变量.
在源码中它是这样声明的private final boolean value;
成员变量value被声明为final,又没给定初始值,这种情况被称为"空白final".
语法上规定必须确保在使用"空白final"变量前被初始化.因此不在成员变量定义的时候初始化那么就只能在构造器里初始化了.其实也可以在构造代码块中对"空白final"进行初始化.
java.lang.Boolean提供了两个构造器
- 使用基本类型的boolean初始化.
既然你是包装基本类型boolean的,那我直接传给你一个基本类型,你给我包装就行了. - 使用java.lang.String类型初始化
同时还可以用字符串对象构造一个java.lang.Boolean.规则很简单,只要"true".equalsIgnoreCase(param)就可以.
在类定义中有两个静态常量,他们分辨代表java.lang.Boolean类型的true和false.
//代表true的java.lang.Boolean类型 public static final Boolean TRUE = new Boolean(true); //代表false的java.lang.Boolean类型 public static final Boolean FALSE = new Boolean(false);
我们都知道正常情况下当使用new关键字时,总会在内存中创建一个新的对象.
同样我们的程序只要执行了new Boolean(true);或new Boolean(false);都会在内存中创建一个对象.如果对于资源比较紧张的部署环境来讲,这种操作其实是很致命的.
其实我们完全可以考虑使用TRUE和FALSE两个静态常量,简单实用.看一段代码.
public static void main(String[] args) { Boolean b1 = new Boolean(true); Boolean b2 = new Boolean(false); //输出"b1:true,b2:false" System.out.println("b1:" + b1 + ",b2:" + b2); Boolean b3 = new Boolean(true); //输出"false" System.out.println(b1 == b3); //下面使用java.lang.Boolean的静态常量TRUE和FALSE Boolean b4 = Boolean.TRUE; Boolean b5 = Boolean.FALSE; //输出"b4:true,b5:false" System.out.println("b4:" + b4 + ",b5:" + b5); Boolean b6 = Boolean.TRUE; //输出"true" System.out.println(b4 == b6); }
上面的代码只是通过调用静态成员来获得对应的java.lang.Boolean对象,很多时候,都会根据参数来获得相应对象.再看一段代码.
public static void main(String[] args) { //Boolean.valueOf(boolean)的使用 Boolean b1 = Boolean.valueOf(true); Boolean b2 = Boolean.valueOf(false); //输出"b1:true,b2:false" System.out.println("b1:" + b1 + ",b2:" + b2); Boolean b3 = Boolean.valueOf(true); //输出"true" System.out.println(b1 == b3); //Boolean.valueOf(String)的使用 Boolean b4 = Boolean.valueOf(null); Boolean b5 = Boolean.valueOf("yes"); Boolean b6 = Boolean.valueOf("tRue"); //输出"b4:false,b5:false,b6:true" System.out.println("b4:" + b4 + ",b5:" + b5 + ",b6:" + b6); Boolean b7 = Boolean.valueOf("TRUE"); //输出"true" System.out.println(b6 == b7); //输出"true" System.out.println(b1 == b7); }
阅读源代码的威力要体现出来了,不懂结果的朋友们不要着急baidu、google.花点时间读读源代码,耐心去看,一定能看懂.
我先贴几段相关的代码,看看上面的输出是怎么回事.
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } public static Boolean valueOf(String s) { return toBoolean(s) ? TRUE : FALSE; } //java.lang.String参数的构造也是调用的这个方法 //其实就是"true".equalsIgnoreCase(name) //忽略了大小写,判断是不是个true字符串 private static boolean toBoolean(String name) { return ((name != null) && name.equalsIgnoreCase("true")); }
自动装箱和拆箱
自动装箱和拆箱我贴出两段代码,大家自己来分析一下.
//java源代码 public static void main(String[] args) { Boolean b1 = true; Boolean b2 = false; boolean b3 = Boolean.TRUE; boolean b4 = Boolean.FALSE; System.out.println(b1 == b3); System.out.println(b2 == b4); } //通过反编译工具,对上面的代码class文件的反编译结果 public static void main(String[] args) { Boolean b1 = Boolean.valueOf(true); Boolean b2 = Boolean.valueOf(false); boolean b3 = Boolean.TRUE.booleanValue(); boolean b4 = Boolean.FALSE.booleanValue(); System.out.println(b1.booleanValue() == b3); System.out.println(b2.booleanValue() == b4); }
其实还有一个办法就是通过eclipse + debug.有兴趣的朋友可是去试试.
如果你的JDK不带 debug信息,在跟踪源代码的时候会看不到变量的状态.