java的包装类及其转换

1 篇文章 0 订阅
1 篇文章 0 订阅


文章内容选自尚硅谷

包装类介绍

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:注释的那一条语句,编译器是会报错的,因为强转类型的运用只能够发生在有子父类关系的时候。没有子父类关系,编译器会报错。
在这里插入图片描述

图片选自尚硅谷

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值