本文适合的人群

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

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

  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. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  2. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  3. 总结30个CSS3选择器

    或许大家平时总是在用的选择器都是:#id  .class  以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选择器,希望对大家有所帮助. 1 *:通用选择器 ;; ...

  4. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  5. ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)

    ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...

  6. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  7. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

  8. Flappy Bird 源码走读

    参考:https://github.com/kirualex/SprityBird 该项目基于spritekit,代码的结构很清楚,感觉用来学习spritekit非常不错. 1.项目只有一个viewC ...

  9. Lesson 22 A glass envolops

    Text My daughter, Jane, never dreamed of receiving a letter from a girl of her own age in Holland. L ...

  10. AngularJS 第四天----控制器

    控制器的作用 今天和大家学习AngularJS中控制器方面的知识,本文会给出一些例子来说明如何使用AngularJS的控制器.在开始我们的例子之前,首先说说AngularJS控制器的作用.简单的来说A ...