JDK源码解析之 Java.lang.Boolean
Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。
此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。
一、类定义
public final class Boolean implements java.io.Serializable,Comparable<Boolean>
{
实现的两个接口:
- java.io.Serializable:可被序列化的标志接口
- Comparable:强行对实现它的每个类的对象进行整体排序
二、成员变量
public static final Boolean TRUE = new Boolean(true);public static final Boolean FALSE = new Boolean(false);public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");private final boolean value;
在内部维护了一个 boolean 类型的 value,在我们调用构造器的时候会将 value 给赋值。
还可以看到内部还有三个常量其中两个是 TRUE、FALSE 分别代表布尔值的两个状态,这样我们在使用的时候就可以直接用而不需要去构建一个。
还有一个 TYPE 是接收了 Class.getPrimitiveClass(“boolean”); 的返回值,我们跟进去可以看到 getPrimitiveClass 是一个 native 方法。
static native Class<?> getPrimitiveClass(String name);
三、构造方法
public Boolean(boolean value) {this.value = value;}//调用parseBoolean(s)public Boolean(String s) {this(parseBoolean(s));}//字符串s忽略大小写后与“true”相等,则返回(Boolean)truepublic static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}
四、普通方法
4.1、toString()
三目表达式
public String toString() {return value ? "true" : "false";}@Overridepublic int hashCode() {return Boolean.hashCode(value);}
4.2、hashCode(boolean value)
即 true 返回 1231 而 false 返回 1237
public static int hashCode(boolean value) {return value ? 1231 : 1237;}public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;}
4.3、getBoolean(String name)
获取系统属性
public static boolean getBoolean(String name) {boolean result = false;try {result = parseBoolean(System.getProperty(name));} catch (IllegalArgumentException | NullPointerException e) {}return result;}
4.4、compareTo(Boolean b)
相同为0,this.value为true返回1,b.value为true返回-1
public int compareTo(Boolean b) {return compare(this.value, b.value);}public static int compare(boolean x, boolean y) {return (x == y) ? 0 : (x ? 1 : -1);}
4.5、逻辑运算
public static boolean logicalAnd(boolean a, boolean b) {return a && b;}public static boolean logicalOr(boolean a, boolean b) {return a || b;}public static boolean logicalXor(boolean a, boolean b) {return a ^ b;}
4.6、equals(Object obj)
先判断是不是从 Boolean 实例化出来的,然后再继续比较是不是相等。
public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;
}
4.7、官方推荐方式valueOf()
public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);}public static Boolean valueOf(String s) {return parseBoolean(s) ? TRUE : FALSE;}public static String toString(boolean b) {return b ? "true" : "false";}
五、总结
Boolean用两个final的静态变量来表示不同状态的实例,通常这个方法我们也可以借鉴,例如编写一个Weekday类,状态只有7个,就不要让用户写new Weekday(1),直接提供Weekday.MONDAY即可。
Boolean为防止用户使用new生成实例,就取消public构造方法,用户要获得静态实例的引用有两个方法:如果申明了public static var,就可以直接访问,比如Boolean.TRUE,第二个方法是通过静态工厂方法:Boolean.valueOf(?)。
如果不提供public构造方法,让用户只能通过上面的方法获得静态变量的引用,还可以大大简化equals()方法:
public boolean equals(Object obj) {return this==obj;
}
JDK源码解析之 Java.lang.Boolean相关推荐
- JDK源码解析之 java.lang.Exception
异常.是所有异常的基类,用于标识一般的程序运行问题.这些问题通常描述一些会被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable public class Exce ...
- JDK源码解析之 java.lang.Error
java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 一.源码部分 //继承了java.lang.Throwable ...
- JDK源码解析之 java.lang.Thread
位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换 ...
- JDK源码解析之 java.lang.Integer
teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一.类定义 public final class Integer extends Number imp ...
- JDK源码解析之 Java.lang.Object
Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现. Object类位于ja ...
- JDK源码解析之 Java.lang.Compiler
Compiler类提供支持Java到本机代码编译器和相关服务.在设计上,它作为一个占位符在JIT编译器实现. 一.源码部分 public final class Compiler {private C ...
- JDK源码解析之 Java.lang.Byte
byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1) By ...
- JDK源码解析之 Java.lang.String
String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...
- JDK源码解析之 java.lang.System
一个和系统环境进行交互的类. System不允许被实例化, 而且是一个final类 一.不能实例化 private System() {} 二.成员变量 public final static Inp ...
最新文章
- java和python哪个好就业2020-java和python哪个未来发展比较好?
- 86. Leetcode 264. 丑数 II (动态规划-基础题)
- linux 域账户密码忘记,linux基础命令-用户域用户组管理
- 拓展 - WebRTC 多视频网络拓扑之三种架构
- 04748JAVA语言程序设计实践考试复习
- bpsk调制及解调实验_漫画讲解调制解调,深奥的通信原理是不是明白了?
- typora主题配置:公众号一键排版
- 微信公众平台后台接入简明指南
- Origin怎么画圆形而非椭圆形?
- word转html java代码_用java实现word转html
- used in key specification without a key length
- 深度学习之学习(3-4)YOLOV4
- 中国移动SP短信网关接入平台
- mysql capi函数详解_CAPI函数描述(A-F)
- windo10系统哪个版本运行最快呢?
- 【SayGoodBye.java】一封离职告别信
- MATHTYPE安装出现问题:无法打开要写入的文件;MathType打开word时“安全警告,宏已被禁用”;mathtype与AXmath不能同时使用
- 华为数字化转型之道 实践篇 第十章 数字化办公:构建全方位的连接与协同
- [LeetCode] 230. Kth Smallest Element in a BST
- python 微信公众号接口中文乱码问题
热门文章
- php json获取get请求,PHP简单的Curl的Get请求和Curl的Post请求和file_get_contents的Get请求获取接口JSON数据...
- qt中QMultiMap获取键值
- mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)
- unix 登录mysql_实例分析mysql用户登录。
- dw服务器文件夹在哪里,Dreamweaver CC
- android访问百度新闻,百度新闻(com.baidu.news) - 8.3.6.0 - 应用 - 酷安
- java获取文件新增内容_关于java生成文件,立即又读这个文件但又找不到文件新增内容的问题...
- php直播pk规则,直播源码中的主播PK功能是如何实现的
- mysql数据库开发笔记_MySQL数据库生成数据库说明文档
- android 混合开发 图片,混合开发的大趋势之一React Native之Image