本文适合的人群

其实感觉写这个标题的内容没有必要,只要你觉得对你有帮助那么就适合你,对你没帮助那么就不适合你.毕竟我不是专业作者,但咱会尽力的.其实最重要的一点是我不希望浪费您宝贵时间.

简要把内容在这里说一下(等会弄目录了,再改成目录方式吧)

  1. 对java.lang.Boolean的概况简单介绍.这里其实和看API差不多,而且没有API全.
  2. 我个人是如何理解java.lang.Boolean的
  3. 拆箱和装箱

我衷心的希望您能提出宝贵的意见,若文中有任何不妥非常希望能得到您的指正.

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);都会在内存中创建一个对象.如果对于资源比较紧张的部署环境来讲,这种操作其实是很致命的.

其实我们完全可以考虑使用TRUEFALSE两个静态常量,简单实用.看一段代码.

    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信息,在跟踪源代码的时候会看不到变量的状态.

解决办法可以看http://www.cnblogs.com/sealedbook/p/3442334.html

最新文章

  1. Bzoj1426 收集邮票
  2. iOS之数据持久化方案
  3. Git_1基础操作,从安装到提交完成(windows)
  4. Hotspot内存溢出测试
  5. Sql 随机更新一条数据返回更新数据的ID编号
  6. 【转】delphi程序只允许运行一个实例的三种方法:
  7. MYSQL查询某字段中以逗号分隔的字符串的方法
  8. 【pyhton】【转】修改递归次数
  9. ArtisticStyle----很好用的C/C++样式格式化工具
  10. Home | eMine: Web Page Transcoding Based on Eye Tracking Project Page
  11. Linux - VIM(VI)编辑器
  12. [背景分离] 识别移动物体基于高斯混合 MOG
  13. iOS 真机调试(最具体的步骤来解决历史,hmt精心打造)
  14. 如何反编译APK?
  15. Django实战(一)-----用户登录与注册系统2(数据模型、admin后台、路由视图)
  16. PDF文件怎么修改,PDF文件编辑方法
  17. 【转】react入门实例教程
  18. 线程之threading
  19. 个人常用eclipse快捷键,不定期更新
  20. java 基础 --- java8 HashMap

热门文章

  1. Python多线程爬虫爬取电影天堂资源
  2. npm 使用小结
  3. 基于注解的bean配置
  4. AutoMapper(一)
  5. Hadoop3 在eclipse中访问hadoop并运行WordCount实例
  6. MyBatis1:MyBatis入门
  7. 借助Nodejs探究WebSocket
  8. 抛弃jQuery:DOM API之操作元素
  9. Visual Studio 实用扩展推荐
  10. 轻量级表达式树解析框架Faller