系列文章目录
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,不能保证总结内容的正确性,若是有错误的话,欢迎大家指出,谢谢!