Java Wrapper 包装类

包装类

包装类的理解

Java提供了两个类型系统,基本数据类型引用数据类型,但是在一些场景中,我们需要使用基本数据类型像对象那样使用。而包装类提供了这种行径

为什么要使用包装类

为了使得基本数据类型的变量具备引用数据类型变量的相关特征。例如,封装性、继承性、多态性。 给各个基本数据类型的变量都提供了对应的包装类。这时候Java才能叫做真正的面向对象

Java针对于八中基本数据类型定义了相应的引用数据类型:包装类(封装类)

特殊注意,只有intchar使用了英文全称,其他的都是首字母变为大写

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

内存结构的变化

相较于基本数据类型只存在于栈空间当中,包装类和对象相同,在堆空间中存放数值,在栈空间中存放地址

public static void main(String []args){
    int num = 1;	//存在于栈空间当中
    Integer obj = new Integer(1);	//数值存在于堆空间,地址存在于栈空间中
}

自定义包装类

public class MyInteger{
    int value;
    public MyInteger(){
        
    }
    public MyInteger(int value){
        this.value = value;
    }
    @Override
    public String toString(){
        return String.valueOf(value);
    }
}

基本数据类型与包装类之间的转换

为什么需要转换
  • 对于基本数据类型来讲,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要讲基本数据类型的变量转换为包装类的对象。

​ 例如,ArrayList的add(Object obj);Object类的equals(Object obj)

  • 对于包装类来讲,使用的是对象,但对象不能进行 + - \ * 的运算,为了能够进行这些运算,就需要将包装类对象转换为基本数据类型。
怎样转换
  • jkd5.0之前,使用构造器、方法进行转换
  • jdk5.0及以后,存在自动装箱、自动拆箱,提高代码编译速度

基本数据类型 ——> 包装类(装箱)

使用包装类的构造器(@Deprecated)

正常转换
class WrapperTest{
    public static void main(String []args){
        //使用构造器进行转换
        int i1 = 10;
        Integer ii1 = new Integer(i1);
        System.out.println(ii1);
        
        float f1 = 12.3f;
        Float ff1 = new Float(f1);
        System.out.println(ff1);
        
        boolean b1 = true;
        Boolean bb1 = new Boolean(b1);
        System.out.println(bb1);
    }
}
//输出结果:
//10
//12.3
//true
使用String进行转换

几种包装类的构造器

//Integer
public Integer(String s) throws NumberFormatException {
       this.value = parseInt(s, 10);
   }
public Integer(int value) {
       this.value = value;
   }
//Float
public Float(float value) {
       this.value = value;
   }
public Float(double value) {
       this.value = (float)value;
   }
public Float(String s) throws NumberFormatException {
       value = parseFloat(s);
   }
//构造器中都有含String的构造器.所以可以通过String类型数据进行声明

使用方法

class WrapperTest{
    public static void main(String []args){
        Float ff1 = new Float("12.3f");
        Integer ii1 = new Integer("12");
    }
}
Boolean的声明

Boolean的构造器

@Deprecated(since="9", forRemoval = true)
   public Boolean(boolean value) {
       this.value = value;
   }
@Deprecated(since="9", forRemoval = true)
   public Boolean(String s) {
       this(parseBoolean(s));
   }
public static boolean parseBoolean(String s) {
       return "true".equalsIgnoreCase(s);	//equalsIgnoreCase() 忽视大小写的比较
   }
//其中,形参是String活boolean value
//所以,形参为字符串和布尔类型都可以
class WrapperTest{
    public static void main(String []args){
        //当形参为boolean value时
        Boolean bb1 = new Boolean(true);
        Boolean bb2 = new Boolean(false);
        
        //当形参为String时
        Boolean bb3 = new Boolean("false");	
        
        //特殊的,当形参为String时,若字符串所存内容不是"true"(四个字母均不区分大小写),都会被当做false
        Boolean bb4 = new Boolean("False");	//false
        Boolean bb5 = new Boolean("Flase");	//false
        Boolean bb6 = new Boolean("12");	//false
        Boolean bb7 = new Boolean("12.3f");	//false
        Boolean bb8 = new Boolean("true");	//true
        Boolean bb9 = new Boolean("TrUe");	//true
    }
}

调用包装类的valueOf( )

public class WrapperTest{
    public static void main(String []args){
        Integer ii1 = Integer.valueOf(12);	//12
        Integer ii2 = Integer.valueOf("12");	//12
        Boolean bb1 = Boolean.valueOf(true);	//true
        Boolean bb2 = Boolean.valueOf("tRuE");	//true
    }
}

包装类 ——>基本数据类型(拆箱)

调用包装类的XxxValue()方法,返回一个基本数据类型

public class WrapperTest {
    public static void main(String[] args) {
        Integer ii1 = Integer.valueOf(12);
        int i1 = ii1.intValue();
        System.out.println(i1);	//12

        Float ff1 = Float.valueOf(12.3f);
        float f1 = ff1.floatValue();
        System.out.println(f1);	//12.f

        Boolean bb1 = Boolean.valueOf(false);
        boolean b1 = bb1.booleanValue();
        System.out.println(b1);	//false
    }
}

默认值的区别

原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了

class Account{
    boolean b1;
    Boolean b2;
    
    double d1;
    Double d2;
}
public class AccountTest{
    public static void main(String []args){
        Account a = new Account();
        System.out.println(a.b1);	//false
        System.out.println(a.b2);	//null
        System.out.println(a.d1);	//0.0
        System.out.println(a.d2);	//null
    }
}

自动装箱、自动拆箱

jdk5.0后,新特性:自动装箱、自动拆箱

public class AutoWrapperTest{
    public static void main(String []args){	
        //自动装箱
        Integer ii1 = 10;
        System.out.println(ii1);	//10

        Boolean bb1 = false;
        System.out.println(bb1);	//false
        
        //自动拆箱
        int i1 = ii1;
        System.out.println(i1)	//10
        boolean b1 = bb1;	
        System.out.println(b1);	//false
        
    }
}
  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值