Java核心技术卷一 -第五章:装箱和拆箱

系列文章目录

Java核心技术卷一 -第一章:java“白皮书”的关键术语
Java核心技术卷一 -第三章:数据类型
Java核心技术卷一 -第三章:变量与常量
Java核心技术卷一 -第三章:运算符
Java核心技术卷一 -第三章:字符串
Java核心技术卷一 -第三章:输入与输出
Java核心技术卷一 -第三章:数组
Java核心技术卷一 -第四章:类之间的关系-依赖
Java核心技术卷一 -第四章:预定义类-LocalDate类小应用
Java核心技术卷一 -第四章:构造器
Java核心技术卷一 -第四章:null引用
Java核心技术卷一 -第四章:方法参数
Java核心技术卷一 -第四章:对象构造
Java核心技术卷一 -第五章:覆盖方法与super
Java核心技术卷一 -第五章:super关键字
Java核心技术卷一 -第五章:类的强制类型转换与instanceof操作符
Java核心技术卷一 -第五章:抽象类与abstract关键字
Java核心技术卷一 -第五章:Object类的toString方法
Java核心技术卷一 -第五章:数组列表初识


前言

本人为java初学者,文章内容仅为个人学习总结分享,其中包含了大量Java核心技术卷一里面的文章内容以及一些网站文章内容,由于参考文章过多,在此并不一一列出,如有侵权,请联系删除。

一、包装类存在的意义

有没有这种需求:调用doSome()方法的时候需要传一个数字进去。但是数字属于基本数据类型,而dosome()方法参数的类型是Object。但是doSome()方法无法接收基本数据类型的数字。那怎么办呢?
可以传一个数字对应的包装类进去。把传入100这个数字经过构造方法包装成对象。

MyInt myInt = new MyInt(100);

doSome()方法虽然不能直接传100,但是可以传一个100对应的包装类型。

doSome(myInt);

代码展示:

public class IntegerTest01 {
    public static void main(String[] args) {
        MyInt myInt = new MyInt(100);
        doSome(myInt);
    }
    public static void doSome(Object obj){
        System.out.println(obj.toString());
    }
}

class MyInt{
    int value;

    public MyInt(){
    }

    public MyInt(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return String.valueOf(value);
    }
}

二、包装类型

在这里插入图片描述

三、Number类

八种包装类中其中6个都是数字对应的包装类,他们的父类都是Number,可以先研一下Number中公共的方法。

Number是一个抽象类,无法实例化对象。

Nunber类的方法:
在这里插入图片描述

代码展示:

public class IntegerTest02 {
    public static void main(String[] args){
    //12这个基本数类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换。
    // 基本数类型-(转换为)->引用数据英型(装箱)
    Integer i = new Integer(123);
    
    //将引用数据类型--(转换为)->基本数据类型
    float f = i.floatValue();
        System.out.println(f);//123.0
        
    // 引用数据类型一(转换为)->基本数据类型(拆箱)    
    int retValue = i.intValue();
        System.out.println(retValue);//123
    }
}

四、自动装箱和自动拆箱

在JDK1.5之后,支持自动装箱和自动拆箱了

自动装箱:基木数据类型自动转换成包装类。
自动拆箱:包装类自动转换成基本数据类型。

有了自动拆箱之后,Number类中的方法就用不着了!

代码展示:

public class Test02 {
    public static void main(String[] args){
        //900是基本数据类型
        //x是包装类型
        //基本数据类型一(自动转换)-->包装类型:自动装箱
        Integer x=900;
        System.out.println(x);

        //×是包装类型
        //y是基本数据类型
        //包装类型一(自动转换)-->基本数据类型:自动拆箱
        int y=x;
        System.out.println(y);

        Integer z=1000;
        //分析为什么这个没有报错呢?
        //"+"两边要求是基本数据类型的数字,z是包装类,不属于基本数类型,这里会进行自动拆箱。将z转换成基本数据类型
        System.out.println(z+1);

        Integer a=1000;//Integer a=new Integer(1000);a是个引用,保存内存地址指向对象。
        Integer b=1000;//Integer b=new Integer(1000);b是个引用,保存内存地址指向对象。
        // ==比较的是对象的内存地址,a和b两个引用中保存的对象内存地址不同。
        // ==这个运算符不会发自动拆机制。(只有+、-、*、/等运算的时候才会。)
        System.out.println(a ==b);//false
    }
}

图示:

在这里插入图片描述

五、缓存

代码展示:

public class Test02 {
    public static void main(String[] args){
        Integer a=128;
        Integer b=128;
        System.out.println(a==b);//false

/*      java中为了提高程序的执行效率,将[-128到127]之间所有的包装对象提前创建好,
        放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要再new了,
        直接从整数型常量池当中取出来。

        原理:×变量中保存的对象的内存地址和变量y中保存的对象的内存地址是一祥的。*/

        Integer x=127;
        Integer y=127;
        System.out.println(x==y);//true
    }
}

图示:

在这里插入图片描述

总结

以上就是本文的内容,记录了一些关于java“装箱和拆箱”的内容,本人也是刚开始接触java,不能保证总结内容的正确性,若是有错误的话,欢迎大家指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luodiab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值