基本数据类型的封装类以及自动装箱自动拆箱机制

基本数据类型

java中一共有八种基本数据类型:byte,char,short,int,long,float,double,boolean

当创建基本数据类型的变量时,不方便我们对数据进行比较麻烦的操作(因为基本数据类型没有类以及可调用的类方法),同时,java又是一门面向对象的语言,号称万物皆对象,因此将基本数据类型的对象转变成引用类型的变量是java必然会进行的操作。那么,有没有和八种数据类型对应的引用类型呢?当然有,这就是接下来要提的封装类。

封装类

java中每种基本数据类型都有自己特有的封装类。

如下图:

即使是第一次看到封装类,我们也能大致发现规律,就是:封装类基本是将基本数据类型的小写首字母变成大写,除了两个比较特殊的可能需要记一下(Integer和Character)。

将基本数据类型转化为引用数据类型后,我们查API就会发现,它和其他的引用数据类型变得一样了,也需要创建对象,也有属性和方法。其中每个封装类都要自己特有的操作数据的方法可以让我们调用,极大程度上减小了了我们对数据在操作上难度。

打开API我们可以看到Integer类具有的属性。

以下这些代码包含了一些Integer类的属性和部分简单方法的调用(其实和之前学的调用方法一样一样的)

package com.Integer;

public class IntegerDemo1 {
	public static void main(String[] args) {
		//Integer 是 int的封装类
		
		//学习1:如何创建Integer对象
		//类名 对象名=new 类名();
		
		Integer x=new  Integer(10);
		//参数必须是能够转化为int类型的String变量
		//否则会抛出NuberFormatException(数字格式化异常)
		Integer y=new Integer("123");
		
		System.out.println(x);
		System.out.println(y);
		
		//学习2:学习5个常量值,常量的值不能改变
		int v1=Integer.BYTES;
		System.out.printf("int类型有%d个字节",v1);
		//使用MIN_VALUE获得取值范围最小值,MAX_VALUE获得取值范围最大值
		System.out.printf("int类型的取值范围是[%d~%d]%n",Integer.MIN_VALUE,Integer.MAX_VALUE);
		//返回类型长度
		System.out.printf("int类型有%d位",Integer.SIZE);
		//返回类的原始类型
		Class<Integer> c=Integer.TYPE;
		System.out.println();
		System.out.println(c);
		//学习3:调用Integer的静态方法
		//调用静态方法语法格式
		//返回值类型 变量名=类名.方法名(实参)
		
		//static int bitCount(int i)
		int num=Integer.bitCount(8);
		System.out.println("二进制数中1的个数为:"+num);
		
		//static String toBinaryString(int i)  十进制--->2进制
		String s1=Integer.toBinaryString(7);
		System.out.println("7的二进制数:"+s1);
		
		//static String toHexString(int i)  10进制-->16进制
		String s2=Integer.toHexString(100);
		System.out.println("100的二进制数:"+s2);
		
		//static String toOctalString  10进制-->8进制
		String s3=Integer.toOctalString(100);
		System.out.println("100的二进制数:"+s3);
		
		//2进制|8进制|16进制的字符串--->10进制数
		//static Integer valueOf(String s,int radix)
		
		int k1=Integer.valueOf("111000",2);
		int k2=Integer.valueOf("64",8);
		int k3=Integer.valueOf("144",16);
		System.out.println(k1+","+k2+","+k3);
		
		//将字符串转化为int类型  String ---> int 
		//static int parseInt(String s)
		int age =Integer.parseInt("20");
		System.out.println(age);
				
	}

}

 

那么问题来了。我们怎样将基本数据类型转化为封装类呢?是向继承中向上转型和向下转型?还是可以用强转的方式转化呢?

所以就引出了装箱和拆箱的概念。

装箱拆箱

我们将基本数据类型转化为引用数据类型的过程叫做装箱,相应的,我们把从引用数据类型转化为基本数据类型的过程叫做拆箱。

如下列代码:我们首先创建了两个Integer类型的对象。然后使用intValue可以将Integer对象拆箱为int类型变量。

package com.Integer;

public class IntegerDemo3 {
	public static void main(String[] args) {
		//创建两个Integer对象
		Integer x=new Integer("10");
		Integer y=new Integer("10");
		//创建两个int类型变量
		int m=10;
		int n=10;
		//valueOf的作用是将int变量转化成Integer对象
		//将int类型变量“手动”装箱
		Integer m1=Integer.valueOf(m);
		Integer n1=Integer.valueOf(n);
		
		//intValue的作用是将Integer对象转化成int类型
		//将Integer对象“手动”拆箱
		int v1=x.intValue();
		int v2=y.intValue();

}

自动装箱自动拆箱

上面我讲了什么叫装箱拆箱,以及怎样装箱拆箱。现在我要说的是java自己的一种机制,叫做自动装箱和自动拆箱。

个人觉得自动装箱和自动拆箱其实和基本数据类型隐式转化一样,是自发进行的,但是它和隐式转化又不同,因为隐式转化是单向的,但是封装类和基本数据类型之间不仅可以自动装箱还可以自动拆箱,因此是双向的。借用反编译器可以看一下class文件中经过处理后的文件,可以看得出,class中自动添加了intValue和valueOf方法,用来适应对方。这就是自动装箱和自动拆箱。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值