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信息,在跟踪源代码的时候会看不到变量的状态.
解决办法可以看http://www.cnblogs.com/sealedbook/p/3442334.html
JDK1.7.0_45源码阅读<java.lang.Boolean>的更多相关文章
- jdk源码分析——java.lang.Boolean
1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象. public static final Boolean TRU ...
- jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现
jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现 一. Set架构 如上图: (01) Set 是继承于Collection的接口.它是一个不允许有重复元素的集合.(0 ...
- jdk1.8.0_45源码解读——LinkedList的实现
jdk1.8.0_45源码解读——LinkedList的实现 一.LinkedList概述 LinkedList是List和Deque接口的双向链表的实现.实现了所有可选列表操作,并允许包括null值 ...
- jdk1.8.0_45源码解读——HashSet的实现
jdk1.8.0_45源码解读——HashSet的实现 一.HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.主要具有以下的特点: 不保证set的迭代顺 ...
- jdk1.8.0_45源码解读——HashMap的实现
jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对 ...
- jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...
- jdk1.8.0_45源码解读——ArrayList的实现
jdk1.8.0_45源码解读——ArrayList的实现 一.ArrayList概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素. ...
- 【JDK1.8】JDK1.8集合源码阅读——总章
一.前言 今天开始阅读jdk1.8的集合部分,平时在写项目的时候,用到的最多的部分可能就是Java的集合框架,通过阅读集合框架源码,了解其内部的数据结构实现,能够深入理解各个集合的性能特性,并且能够帮 ...
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
随机推荐
- ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- java根据html生成摘要
转自:http://java.freesion.com/article/48772295755/ 开发一个系统,需要用到这个,根据html生成你指定多少位的摘要 package com.chendao ...
- 在开发中到底要不要用var?
var是.net的一个语法糖,在Resharper中推荐都使用这个关键字,平常我也是经常用:但是在跟其他程序员推广使用时,他的一些考虑引发了我的深思,到底该不该使用这个关键字呢? 我使用的理由 我使用 ...
- 使用Nginx+Lua代理Hadoop HA
一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...
- ASP.NET MVC Model元数据(一)
ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- Chrome 控制台不完全指南
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...
- 我所理解的SOA和微服务
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- java的继承练习
看程序写结果: A:一个类的静态代码块,构造代码块,构造方法的执行流程 静态代码块 > 构造代码块 > 构造方法 B:静态的内容是随着类的加载而加载 静态代码块的内 ...