本文适合的人群

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

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

  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

JDK1.7.0_45源码阅读<java.lang.Boolean>的更多相关文章

  1. jdk源码分析——java.lang.Boolean

      1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象.     public static final Boolean TRU ...

  2. jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现

    jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现 一. Set架构 如上图: (01) Set 是继承于Collection的接口.它是一个不允许有重复元素的集合.(0 ...

  3. jdk1.8.0_45源码解读——LinkedList的实现

    jdk1.8.0_45源码解读——LinkedList的实现 一.LinkedList概述 LinkedList是List和Deque接口的双向链表的实现.实现了所有可选列表操作,并允许包括null值 ...

  4. jdk1.8.0_45源码解读——HashSet的实现

    jdk1.8.0_45源码解读——HashSet的实现 一.HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.主要具有以下的特点: 不保证set的迭代顺 ...

  5. jdk1.8.0_45源码解读——HashMap的实现

    jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对 ...

  6. jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现

    jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...

  7. jdk1.8.0_45源码解读——ArrayList的实现

    jdk1.8.0_45源码解读——ArrayList的实现 一.ArrayList概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素. ...

  8. 【JDK1.8】JDK1.8集合源码阅读——总章

    一.前言 今天开始阅读jdk1.8的集合部分,平时在写项目的时候,用到的最多的部分可能就是Java的集合框架,通过阅读集合框架源码,了解其内部的数据结构实现,能够深入理解各个集合的性能特性,并且能够帮 ...

  9. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

随机推荐

  1. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  2. 图解Spark API

    初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...

  3. 关系型数据库与NoSQL数据库

    关系型数据库的优缺点 优点: 可以做事务处理,从而保证了数据的一致性: 可以进行JOIN等多表查询: 由于以SQL标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处). 缺点: 大量数据的写 ...

  4. HBase笔记:对HBase原理的简单理解

    早些时候学习hadoop的技术,我一直对里面两项技术倍感困惑,一个是zookeeper,一个就是Hbase了.现在有机会专职做大数据相关的项目,终于看到了HBase实战的项目,也因此有机会搞懂Hbas ...

  5. 浅谈跨域以及WebService对跨域的支持

    跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...

  6. JS入门

    1,undefined,NaN,Null,infinity 1) undefined 是undefined 类型 var a; //声明变量后不赋值 typeof 类型判断方法 console.log ...

  7. Android开发学习之路-3DTouch效果模仿

    3D Touch是什么效果的大家应该都知道了.什么?不知道,那也没办法呀,我也没有iPhone 6s演示给你看的. 本篇博客要做的效果图: 来个低质量动图: 这个动图效果不是很好,实际上模糊效果应该是 ...

  8. linux下如何添加一个用户并且让用户获得root权限

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing pass ...

  9. python 三元运算

    C:\Users\Administrator>pythonPython 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.190 ...

  10. (转)倾力总结40条常见的移动端Web页面问题解决方案

    原文链接:戳这里 1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太 ...