java的包装类
文章内容选自尚硅谷
包装类介绍
java当中的基本数据类型并不是类的一种,没有方法,也没有属性,而java是面向对象的编程,如果把基本数据类型也当作类的一种,再调用类的方法和属性,则java就能充分体现面向对象的编程思想。
java为了解决这个问题,提供了包装类的工具。
图片选自尚硅谷
如图所示,每一个包装类类型一一对应一种基本数据类型,其中除boolean和char的包装类,其余的父类皆为Number类。基本数据类型和包装类是两种独立的工具,两者可以相互转换。在编程中,可以使用包装类来代替基本数据类型,从而解决基本数据类型不能调用方法的问题。
包装类与基本数据类型、字符串之间的转换
可以用一张图来概括转换关系
图片选自尚硅谷
包装类与基本数据类型之间的转换
基本数据类型转换成包装类
采用单元测试的方法,测试包装类与基本数据类型的转换
格式为 包装类 变量名 = new 包装类(初始化值);
代码如下,创建一个WrapperTest类
package com.atguigu.java2;
import org.junit.Test;
public class WrapperTest {
@Test
public void test1(){
int num1 = 10;
Integer in1 = new Integer(num1);
System.out.println(in1 );
System.out.println(in1.toString() );
System.out.println(in1 + 1);
System.out.println(in1.toString()+1);
}
}
测试结果为
10
10
11
101
分析这四个结果的原因,第一个是因为println方法,当参数列表为对象的引用的时候,会调用toString方法,由于包装类重写了toString方法,输出为10,详情可以参考java的Object类的方法(equals和toString).
第二个是直接调用包装类的toString方法,其原理同第一个一样。
第四个是测试toString返回的结果是整形还是字符串类型,可见返回了字符串类型
第三个原则上来讲应该和第四个一样,但这出现了java的自动拆箱,表达式先转换为整型的结果,再进行输出。
也可以在构造器中放入字符串
Integer in2 = new Integer("123");
System.out.println(in2.toString());
System.out.println(in2.toString()+1);
结果为
123
1231
但是,如果改为Integer in2 = new Integer(“123a”); 编译虽然会通过,但运行会报错java.lang.NumberFormatException
特别地,针对布尔类型
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("true");
System.out.println(b1);
System.out.println(b2);
Boolean b3 = new Boolean("true122");
Boolean b4 = new Boolean("truE");
System.out.println(b3);
System.out.println(b4);
运行结果
true
true
false
true
当字符串的值不为true,输出会报false而不是报错,而且字符串的值不区分大小写
分析Boolean(“true122”)的构造器
public Boolean(String s) {
this(parseBoolean(s));
}
点击parseBoolean查看源码
public static boolean parseBoolean(String s) {
return ((s != null) && s.equalsIgnoreCase("true"));
}
可见,equalsIgnoreCase意思是不区分大小写,若不区分大小写的结果不为“true”,返回false。
在WrapperTest的java文件中继续写一个类
class Order{
boolean isMale;
Boolean isFemale;
}
再进行测试
Order order = new Order();
System.out.println(order.isMale);
System.out.println(order.isFemale);
测试结果
false
null
因为Boolean是一个类,isFemale是一个引用数据类型,引用数据类型的值要么为null,要么为地址值,因为这儿还没有创建对象,因此为null。
包装类转换成基本数据类型
方法:调用包装类的xxxValue()方法
代码如下
@Test
public void test2(){
Integer in1 = new Integer(12);
int i1 = in1.intValue();
System.out.println(i1);
}
测试结果为12
自动装箱和自动拆箱
自动装箱和自动拆箱是JDK5.0以后加入的新特性。
自动装箱是把基本数据类型转换成包装类,运用场景
@Test
public void test3(){
int in1 = 13;
method(in1);
Integer num = 14;
Integer num2 = 15;
System.out.println(num.toString());
System.out.println(num2.toString());
}
public void method(Object obj){
System.out.println(obj);
}
结果为
13
14
15
在运行method方法的时候,方法的形参是类,按理说不能把基本数据类型放进去的,但是自动装箱会根据需求,把基本数据类型自动转换成包装类。
自动拆箱就是把包装类转换成基本数据类型。
Integer num = 14;
int i1 = num;
System.out.println(i1);
此为一个自动装、拆箱的过程,输出结果为14.
包装类和基本数据类型同String类之间的转换
有了自动装拆箱,包装类和基本数据类型可以看作一个整体,现在研究这个整体同String之间的转换。
基本数据类型、包装类转换成String类型
方法一: 通过连接运算的方法进行转换
int num1 = 20;
String str = num1+ "";
方法二:调用String重载的valueOf(Xxx xxx)方法。
@Test
public void test4(){
Float f1 = 12.3f;
String str = String.valueOf(f1);
System.out.println(str);
}
String类型转换成基本数据类型或包装类
调用包装类中的parseXxx方法
代码如下
@Test
public void test5(){
String str1 = "123";
// Integer in1 = (Integer)str1;
int i = Integer.parseInt(str1);
System.out.println(i);
}
运行结果为123,可见String与包装类的转换,肯定要调用被转换类型的方法,即等号左边类内的方法。
对于boolean型,如果把等号右边的字符串数据再加上其他字符,转换结果是false,如果不是布尔型,转换会报错。
ps:注释的那一条语句,编译器是会报错的,因为强转类型的运用只能够发生在有子父类关系的时候。没有子父类关系,编译器会报错。
图片选自尚硅谷