本文主要是介绍java.lang解析Boolean类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Boolean类:
public final class Booleanextends Objectimplements Serializable, Comparable<Boolean>
字段摘要 | |
---|---|
static Boolean | FALSE 对应基值 false 的 Boolean 对象。 |
static Boolean | TRUE 对应基值 true 的 Boolean 对象。 |
static Class<Boolean> | TYPE 表示基本类型 boolean 的 Class 对象。 |
构造方法摘要 | |
---|---|
Boolean(boolean value) 分配一个表示 value 参数的 Boolean 对象。 | |
Boolean(String s) 如果 String 参数不为 null 且在忽略大小写时等于 "true" ,则分配一个表示true 值的Boolean 对象。 |
方法摘要 | |
---|---|
boolean | booleanValue() 将此 Boolean 对象的值作为基本布尔值返回。 |
int | compareTo(Boolean b) 将此 Boolean 实例与其他实例进行比较。 |
boolean | equals(Object obj) 当且仅当参数不是 null ,而是一个与此对象一样,都表示同一个 Boolean 值的 boolean 对象时,才返回 true 。 |
static boolean | getBoolean(String name) 当且仅当以参数命名的系统属性存在,且等于 "true" 字符串时,才返回 true 。 |
int | hashCode() 返回该 Boolean 对象的哈希码。 |
static boolean | parseBoolean(String s) 将字符串参数解析为 boolean 值。 |
String | toString() 返回表示该布尔值的 String 对象。 |
static String | toString(boolean b) 返回一个表示指定布尔值的 String 对象。 |
static Boolean | valueOf(boolean b) 返回一个表示指定 boolean 值的 Boolean 实例。 |
static Boolean | valueOf(String s) 返回一个用指定的字符串表示值的 Boolean 值。 |
public class CBoolean extends Object implements Serializable,Comparable<CBoolean>{
先看字段摘要: /*** The {@code Boolean} object corresponding to the primitive* value {@code true}.* *对应基值 true 的 Boolean 对象。*Boolean,50行*/public static final Boolean TRUE = new Boolean(true);/*** The {@code Boolean} object corresponding to the primitive* value {@code false}.* * 对应基值 false 的 Boolean 对象。* Boolean,56行*/public static final Boolean FALSE = new Boolean(false);/*** The Class object representing the primitive type boolean.** @since JDK1.1* * 表示基本类型 boolean 的 Class 对象。* 由于Class.getPrimitiveClass是native方法,这里并不能实现* Boolean,64行*/
// @SuppressWarnings("unchecked")
// public static final Class<CBoolean> TYPE = (Class<CBoolean>) Class.getPrimitiveClass("boolean");
这里TRUE和FALSE都是被定义成了Boolean类的对象,TYPE为boolean的Class对象
下面是构造方法:
首先是定义一个boolean存储Boolean对象的值:
/*** The value of the Boolean.* 存储Boolean的值* Boolean,71行* @serial*/private final boolean value;
这个值是final类型的,也就是说在value初始化之后值是不可变的。
然后是构造方法的实现:
/*** 构造方法,设置Boolean类的值* Boolean,87行* @param value*/public CBoolean(boolean value) {this.value = value;}
第一个构造方法比较简单,直接把传入的boolean值传进来就行了。
然后是第二种:
/*** 构造方法,实际调用的是CBoolean(boolean value)方法* @param s*/public CBoolean(String s) {this(parseBoolean(s));}/*** 判断传入的字符串是否和true相等,返回boolean值* Boolean,121行* @param s* @return*/public static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}
第二种是传入一个String类型的对象,判断是否和true相等,然后返回对应的boolean值,关于equalsIgnoreCase的使用,我们在解析String的时候再说吧,下一篇就说一下String。
下面是方法摘要:
booleanValue方法:
/*** 返回Boolean对象的值* Boolean,131行* @return*/public boolean booleanValue() {return value;}
直接返回Boolean对象当中存的boolean值
compareTo方法:
/*** 将此Boolean实例和其他实例比较* Boolean,273行*/@Overridepublic int compareTo(CBoolean b) {return compare(this.value, b.value);}/*** 将x,y值进行比较,相等返回0,不等时x为true返回1,为false返回-1* Boolean,290行* @param x* @param y* @return*/public static int compare(boolean x, boolean y) {return (x == y) ? 0 : (x ? 1 : -1);}
将x,y值进行比较,相等返回0,不等时x为true返回1,为false返回-1 equals方法:
/*** 当且仅当参数不是 null,而是一个与此对象一样,都表示同一个 Boolean 值的 boolean 对象时,才返回 true。* Boolean,225行*/public boolean equals(Object obj) {if (obj instanceof Boolean) {return value == ((Boolean)obj).booleanValue();}return false;}
在Object类中我们知道equals的方法实现是这样的: public boolean equals(Object obj) { // TODO Auto-generated method stub return (this == obj);
}
在Boolean类里面,对equals方法进行了复写,判断Boolean里面存储值的value变量是否相等。 getBoolean方法:
/*** 当且仅当以参数命名的系统属性存在,且equals传入的字符串name为true时,才返回 true。* Boolean,251行* @param name* @return*/public static boolean getBoolean(String name) {boolean result = false;try {result = parseBoolean(System.getProperty(name));} catch (IllegalArgumentException | NullPointerException e) {}return result;}
这个getBoolean方法的JDK1.6API中文文档的翻译上有问题,英文文档解释是:
/**
* Returns {@code true} if and only if the system property
* named by the argument exists and is equal to the string
* {@code "true"}. (Beginning with version 1.0.2 of the
* Java<small><sup>TM</sup></small> platform, the test of
* this string is case insensitive.) A system property is accessible
* through {@code getProperty}, a method defined by the
* {@code System} class.
/
翻译的结果是:当且仅当以参数命名的系统属性存在,且等于 "true"
字符串时,才返回 true
。
正确的理解应该是:当且仅当以参数命名的系统属性存在,且equals传入的字符串name为true时,才返回 true。
如果要让返回值为true,首先要添加一个参数到系统属性里面,具体情况可以后面测试结果。
hashCode方法:
在Object类里面,hashCode方法是native的,而Boolean类里面是这样实现的:
/*** 返回该 Boolean 对象的哈希码。* Boolean,199行*/@Overridepublic int hashCode() {return Boolean.hashCode(value);}/*** Returns a hash code for a {@code boolean} value; compatible with* {@code Boolean.hashCode()}.** @param value the value to hash* @return a hash code value for a {@code boolean} value.* @since 1.8* * 返回该 Boolean 对象的哈希码。* Boolean,212行*/public static int hashCode(boolean value) {return value ? 1231 : 1237;}
也就是说boolean值为true的Boolean对象的hashCode一定为1231,false为1237,还有一个前提,这个是JDK1.8以后实现的方法。 parseBoolean方法:
/*** 判断传入的字符串是否和true相等,返回boolean值* Boolean,121行* @param s* @return*/public static boolean parseBoolean(String s) {return ((s != null) && s.equalsIgnoreCase("true"));}
判断字符串是否和true相等,返回boolean值,这个前面说过了。 toString方法:
/*** 返回表示该布尔值的 String 对象* Boolean,188行*/public String toString() {return value ? "true" : "false";}
/*** 返回表示该布尔值的 String 对象* Boolean,176行* @param b* @return*/public static String toString(boolean b) {return b ? "true" : "false";}
相当于是直接吧Boolean对象转化为对应的“true”和“false”String对象,跟当前的Boolean值是没有任何关系的 valueof方法:
/*** 根据boolean值返回Boolean对象* @param b* @return*/public static CBoolean valueOf(boolean b) {return (b ? TRUE : FALSE);}/*** 返回一个用指定的字符串表示值的 Boolean 值。* 如果字符串不为"true"返回的都是 FALSE Boolean对象* @param s* @return*/public static CBoolean valueOf(String s) {return parseBoolean(s) ? TRUE : FALSE;}
下面测试方法:
测试过程中发现一个问题,如下:
boolean b;Boolean a = b = true;System.out.println(a.booleanValue());
我们发现这段代码运行是没有任何问题的,打印出来的结果也是true,但是会发现true是一个 boolean变量也是一个关键字,是一个基本数据类型,而Boolean是一个类,怎么能够直接把一个基本数据类型赋值给一个类呢?这个是不是有些问题呢?我回头看了一下代码,发现里面有这么一段: /*** The Class object representing the primitive type boolean.** @since JDK1.1* * 表示基本类型 boolean 的 Class 对象。* 由于Class.getPrimitiveClass是native方法,这里并不能实现* Boolean,64行*/
// @SuppressWarnings("unchecked")
// public static final Class<CBoolean> TYPE = (Class<CBoolean>) Class.getPrimitiveClass("boolean");
这里面应该是通过这个Class.getPrimitiveClass方法来实现的,在Class中,方法如下:
/** Return the Virtual Machine's Class object for the named* primitive type.*/static native Class<?> getPrimitiveClass(String name);
也就是说这个方法可以返回当前基本数据类型的对象。
测试booleanValue方法:
public static void main(String args[]){CBoolean cBoolean = new CBoolean(true);//因为不能使用getPrimitiveClass方法,所以只能这样初始化
// test();testBooleanValue(cBoolean);}
先初始化一个cBoolean对象,并且赋值为true,
/*** 测试booleanValue方法* @param cBoolean*/public static void testBooleanValue(CBoolean cBoolean){System.out.println(cBoolean.booleanValue());}
测试结果是打印为true
测试compareTo方法:
/*** 测试compare方法* @param cBoolean*/public static void testCompare(){//定义一个false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//定义一个true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//打印输出结果testCompareTo(booleanTrue,booleanTrue);testCompareTo(booleanTrue,booleanFalse);testCompareTo(booleanFalse,booleanTrue);testCompareTo(booleanFalse,booleanFalse);}/*** 测试comareTo的结果* @param from* @param to*/public static void testCompareTo(CBoolean from,CBoolean to){System.out.println(String.format("from:%s,to:%s,result:%s", from.booleanValue(),to.booleanValue(),from.compareTo(to)));}
结果为:
将from,to值进行比较,相等返回0,不等时from为true返回1,为false返回-1
测试equals、getBoolean、hashCode和parseBoolean方法:
/***测试equals、getBoolean、hashCode和parseBoolean方法: *@param cBoolean*/public static void test4Function(){//定义一个值为true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//定义一个值为false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//测试equals方法testEquals(booleanTrue,booleanTrue);testEquals(booleanTrue,booleanFalse);//测试getBoolean方法testGetBoolean("true",false);testGetBoolean("true",true);testGetBoolean("oathchen",false);testGetBoolean("oathchen",true);//测试hashCode方法testHashCode(booleanTrue);testHashCode(booleanFalse);//测试parseBoolean方法testParseBoolean(null);testParseBoolean("true");testParseBoolean("false");}/*** 测试equals方法* @param from* @param to*/public static void testEquals(CBoolean from,CBoolean to){System.out.println(String.format("euqals from:%s,to:%s,result:%s", from.booleanValue(),to.booleanValue(),from.equals(to)));}/**
* 测试getBoolean方法
* @param cBoolean
* @param isSetProperty 是否设置成系统属性
*/
public static void testGetBoolean(String str,Boolean isSetProperty){
if(isSetProperty)
System.setProperty(str, "true");
System.out.println(String.format("getBoolean str:%s,isSetProperty:%s,getBoolean:%s", str,isSetProperty,CBoolean.getBoolean(s tr)));
}/*** * 测试hashCode方法* @param cBoolean*/public static void testHashCode(CBoolean cBoolean){System.out.println(String.format("hashCode Boolean值:%s,hashCode:%d",cBoolean.booleanValue(),cBoolean.hashCode()));}/*** 测试ParseBoolean方法* @param str*/public static void testParseBoolean(String str){System.out.println(String.format("parseBoolean str:%s,result:%s", str,CBoolean.parseBoolean(str)));}
测试结果为:
当使用equals方法的时候,只有from和to的boolean值相同的时候才会返回true
getBoolean方法是判断系统内部的变量键值对的”值“是否为true,getBoolean方法参数相当于是键值对的”键“,传入“true”字符串并不会使得返回结果为true。
hashCode说过了,在JDK1.8之后,Boolean对象的boolean值为true的实例hashCode一定为1231,为false的hashCode一定为1237
parseBoolean判断传入的字符串是否和true相等,返回boolean值
测试toString和valueOf方法:
/*** 测试toString和valueOf* @param cBoolean*/public static void test2StringAndValueOf(){//定义一个值为true的CBoolean对象CBoolean booleanTrue = new CBoolean(true);//定义一个值为false的CBoolean对象CBoolean booleanFalse = new CBoolean(false);//打印输出toString的结果:System.out.println(String.format("booleanTrue toString: %s", booleanTrue.toString()));System.out.println(String.format("booleanTrue toString(boolean true): %s", booleanTrue.toString(true)));System.out.println(String.format("booleanTrue toString(boolean false): %s", booleanTrue.toString(false)));//测试valueof的结果:System.out.println(String.format("valueOf(boolean true):%s", CBoolean.valueOf(true)));System.out.println(String.format("valueOf(boolean false):%s", CBoolean.valueOf(false)));System.out.println(String.format("valueOf(String true):%s", CBoolean.valueOf("true")));System.out.println(String.format("valueOf(String true):%s", CBoolean.valueOf("false")));System.out.println(String.format("valueOf(String other):%s", CBoolean.valueOf("other")));}
结果为:
toString无参方法直接返回的是当前CBoolean对象的Value值,有参方法直接返回的是参数当中传入的boolean值
valueOf方法其实没什么好说的,输入的是true,返回true,不是true的返回false,
要注意的一点是:
System.out.println(String.format("valueOf(boolean true):%s", CBoolean.valueOf(true)));
我们这里valueOf返回的是一个CBOOlean对象,而format里面是%s,也就是说是字符串,这里是直接调用了CBoolean对象的toString方法打印出来的结果。
这篇关于java.lang解析Boolean类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!