本文适合的人群

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

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

  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学习系列】第3课--Java 高级教程

    本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...

  2. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  3. 28个你必须知道的HTML5的新特性,技巧以及技术

    崭新新的页面布局 传统的: HTML5: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<f ...

  4. 基于Vue2.0的单页面开发方案

    2016的最后一天,多多少少都应该总结一下这一年的得失,哪里做的好,哪里需要改进,记一笔,或许将来会用到呢. 毕业差不多半年了,一直是一个人在负责公司项目的前端开发与维护,当时公司希望前后端分离,提高 ...

  5. 【从零开始学BPM,Day5】报表配置及自定义功能页面开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  6. Hello Jexus

    一.关于 CentOS CentOS(Community Enterprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照 ...

  7. Mono+Jexus部署C# MVC的各种坑

    如果你看到这篇文章,先别急着动手,过完一遍,确定是你要的再动手. 别人提到的这里不赘述,只说查了好久才知道的. 1号坑:System.IO.FileNotFoundException Could no ...

  8. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  9. opengl 笔记(1)

    参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test ...

  10. AngularJS实例实战

    学习了这么多天的AngularJS,今天想从实战的角度和大家分享一个简单的Demo--用户查询系统,以巩固之前所学知识.功能需求需要满足两点 1.查询所有用户信息,并在前端展示 2.根据id查询用户信 ...