Java从入门到精通16==》包装类概念、装箱与拆箱

Java从入门到精通16

2023.8.3

包装类

一、什么是包装类

首先我们要知道,Java有两种基本数据类型即基本数据类型、引用数据类型。
然而基本类型以值的形式存在,不是以对象的形式存在,不能直接参与面向对象的方法。所以为解决这一问题,Java推出了包装类。
把基本类型 包装 成 类 的形式,即包装类,就可以面向对象。

因为八大基本类型,所以对应就有八大包装类
在这里插入图片描述

其中Character(char)和 Boolean(boolean) 是Object类的子类,Integer(int),Long(long),Double(double),Short(short),Float(float),Byte(byte)是Number类的子类。
在这里插入图片描述

Number类是一个抽象类它继承自Object类,Number类定义了几个抽象方法,要求数字类型的包装类可以将其表示的数字以任意数字类型返回。
注意:

  • 包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值
  • 所以包装类都是final类型,因此不可以创建他们的子类
    示例:
package 什么是包装类;
public class Demo {
    public static void main(String[] args) {
       A a=new A();//A类型引用变量a指向实例化A的地址值
        System.out.println(a);
         a=new A();//给变量a重新赋实例化A的地址值
        System.out.println(a);
        //从代码上看a两次均等于new A ();结果应该相等
    }
}
final class A{
}

在这里插入图片描述
所以,虽然不能更改包装类里面的值,但是可以更改引用 变量的地址值达到更改数据。

二、装箱与拆箱

1、什么是装箱拆箱

装箱:基本数据型变为其对应的包装类对象

拆箱:将包装类中包装的基本数据型取出

2、如何实现

以Integer为例:
  1. 装箱
  • 使用Integer类的构造方法
    构造方法:
    1. public Integer(int 变量名/数值) ------------------将int类型转为十进制Integer类型
    2. public Integer(String 变量名/字符串) -----------将String类型的字符串(由数字组成)转为十进制Integer类型

示例:

package 装箱与拆箱;
//装箱操作
public class Demo1 {
    public static void main(String[] args) {
        int i=12;
        String s="20";
        Integer x=new Integer(i);
        Integer y=new Integer(s);
        System.out.println(x);
        System.out.println(y);
    }
}

  • 使用Integer类内部的valueOf( )方法
    内部方法:
    1. public static Integer valueOf(int 变量名/数值)-----------------------输入的数值为int类型,通过valueOf方法转为十进制Integer类型。该方法有一个行参
    2. public static Integer valueOf(String 变量名/字符串)----------------输入的字符串需为纯数字组成,通过valueOf方法转为十进制Integer类型。该方法有一个行参
    3. public static Integer valueOf(String 变量名/字符串,int 基数)-----输入的字符串(需为纯数字组成)为基数进制的,通过valueOf方法转为十进制Integer类型。例如(String s,int 2),它的意思是由数字组成的字符串s为二进制数。该方法有两个行参

注意:当int 的数值在-128 ~ 27内时,直接使用常量池,不在-128 ~ 127,都是创建的新对象,这个现象可以在valueOf的底层代码中发现在这里插入图片描述
在这里插入图片描述
示例:

package 装箱与拆箱;

public class Demo2 {
    public static void main(String[] args) {
        int a=20;
        String b="22";
        System.out.println(Integer.valueOf(a));
        System.out.println(Integer.valueOf(b));
        System.out.println(Integer.valueOf(b, 4));
    }
}

在这里插入图片描述

  • 自动装箱
    系统自动完成装箱操作,也就是自动类型转换
package 装箱与拆箱;

public class Demo3 {
    public static void main(String[] args) {
        Integer a=10;//此时a是一个对象所以编译器对其进行自动装箱操作
    }
}

  1. 拆箱
  • 调用Integer类的intValue()方法
    public int intValue()-----------将int类型转为Integer类型
package 装箱与拆箱;

public class Demo4 {
    public static void main(String[] args) {
       Integer a=129;//此时a为Integer的引用对象,因为129>127
       int b=a.intValue();//将Integer类型的变量a转为int类型,并创造一个变量接收返回值

    }
}

  • 自动装箱
    系统自动完成开箱操作,也就是自动类型转换
package 装箱与拆箱;

public class Demo3 {
    public static void main(String[] args) {
        Integer a=10;//此时a是一个对象所以编译器对其进行自动装箱操作
         a=a+10;//因为对象不能参加实数运算,所以编译器对其进行自动开箱操作
    }
}


因为Integer(int),Long(long),Double(double),Short(short),Float(float),Byte(byte)是Number类的子类,所以其装箱开箱操作相似。

以Character类为例
  1. 装箱
  • 使用Character类的构造方法
    构造方法:
    public Character(char 变量名/字符)-------将char类型转为Character类型
package 装箱与拆箱;

public class Demo5 {
    public static void main(String[] args) {
        Character a = new Character('a');
    }
}
  • 使用Character类的内部方法装箱
    内部方法:
    public static Character valueOf(char 变量名/字符)—将char类型转为Character类型
package 装箱与拆箱;

public class Demo6 {
    public static void main(String[] args) {
        char a='a';
        System.out.println(Character.valueOf(a));
        System.out.println((int)Character.valueOf(a));
    }
}

在这里插入图片描述

  • 自动装箱
package 装箱与拆箱;

public class Demo7 {
    public static void main(String[] args) {
        Character x='a';//此时x是一个对象,而‘a’为个字符,所以系统自动为‘a’进行装箱操作
    }
}

  1. 拆箱
  • 使用Character类的内部方法拆箱
package 装箱与拆箱;

public class Demo8 {
    public static void main(String[] args) {
        Character x='a';
        char y=x.charValue();
        System.out.println(y);
    }
}

在这里插入图片描述

  • 自动拆箱
package 装箱与拆箱;

public class Demo7 {
    public static void main(String[] args) {
        Character x='a';//此时x是一个对象,而‘a’为个字符,所以系统自动为‘a’进行装箱操作
        System.out.println(x+'b');//此时系统自动将x对象转为char类型,a字符对应的ASCII表为
                                  //97,b字符对应的为98,所以输出为195
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我头像真的只是只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值