代码演示:
public class IntegerTest01 {public static void main(String[] args) {//把100这个数字经过构造方法包装成对象MyInt myInt= new MyInt(100);//doSome()方法虽然不能直接传100,但是可以传一个100对应的包装类型IntegerTest01.doSome(myInt);}public static void doSome(Object obj){System.out.println(obj);}
}
自己建立的包装类:
public class MyInt extends Object{//这种包装类目前是自己手动写的,实际开发中我们不需要自己写//8种基本数据类型对应的8种包装类,SUN公司已经写好了,我们可以直接用int value;public MyInt() {}public MyInt(int value) {this.value = value;}@Overridepublic String toString() {return String.valueOf(value);}
}
需求:
调用doSome()方法的时候需要传一个数字进去
问题:
但是数字属于基本数据类型,而doSome()方法参数的类型是Object
可见doSome()方法无法接受基本数据类型的数字
解决:
可以传一个数字对应的包装类进去,达到数据转型的作用
疑问:
什么是包装类
答案:
包装类就是将数据进行包装,然后进行传递的作用
作用:
方便开发
8种基本数据类型对应的包装类型名是什么?
(SUN公司已经写好了)(基本就是对应首字母大写的包装类)
基本数据类型 包装类型
byte java.lang.Byte(父类Number)
short java.lang.Short(父类Number)
int java.lang.Integer(父类Number)
long java.lang.Long(父类Number)
float java.lang.Float(父类Number)
double java.lang.Double(父类Number)
boolean java.lang.Boolean(父类Object)
char java.lang.Character(父类Onject)
以上8种包装类中,重点以java.lang.Integer为代表进行学习,其它的类型依葫芦画瓢就行
8种包装类其中6个都是数字对应的包装类,他们的父类都是Number,可以先研究一下Number中公共的方法:
Number是一个抽象类,无法实例化对象
Number类中有几个方法,这些方法是负责拆箱的
术语:
装箱:基本数据类型-->引用数据类型
拆箱:引用数据类型-->基本数据类型
代码演示:
public class IntegerTest02 {public static void main(String[] args) {//基本数据类型-->引用数据类型(装箱)Integer integer=new Integer(100);System.out.println(integer);//引用数据类型-->基本数据类型(拆箱)//.floatValue() 是Integer的父类Number中的其中一个方法float f=integer.floatValue();System.out.println(f);//引用数据类型-->基本数据类型(拆箱)int retValue=integer.intValue();System.out.println(retValue);}
}
结果:(由于Integer中的toString方法已经重写了,因此输出引用的时候就不再是原始的内存地址了)
通过常量获取最大值和最小值:
代码演示:
public class IntegerTest03 {public static void main(String[] args) {System.out.println("int的最大值"+Integer.MAX_VALUE);System.out.println("int的最小值"+Integer.MIN_VALUE);//依葫芦画瓢System.out.println("byte的最大值"+Byte.MAX_VALUE);}
}
结果:
自动装箱和自动拆箱:
代码演示1:
public class IntegerTest04 {public static void main(String[] args) {//自动装箱Integer x=100;//自动拆箱int y=x;}
}
代码演示2:
public class StringTest07 {public static void main(String[] args) {//i是引用类型,这里是自动装箱//等同于Interger i=new Interger(100);Integer i=100;//加号+两边要求是基本数据类型的数字,i是包装类,不属于基本数据类型//这里直接自动拆箱//在java5之后编译器才不会报错System.out.println(i+1);//101Integer a=1000;Integer b=1000;//比较的是内存地址System.out.println(a==b);//flase//结论:只有运算的时候才会自动拆箱,==不属于运算符号,因此不会自动拆箱}
}
代码演示3(面试):
【java中为了提高程序的效率,将[-128-127]之间所有的包装对象提前创建好,放到了一个方法区的“整数型常量池”中,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池中取出来用即可】
public class IntegerTest05 {public static void main(String[] args) {Integer i=128;Integer z=128;System.out.println(i==z);//falseInteger x=127;Integer y=127;System.out.println(x==y);//true}
}
查看源代码:
【源代码中ctrl+f搜索-128,在类初始化的时候,static静态代码块创建出256个对象,存储到catch[]数组缓存中】
代码演示 4:
public class IntegerTest06 {public static void main(String[] args) {//手动装箱Integer x=new Integer(1000);//手动拆箱int y=x.intValue();System.out.println(y);//不是一个数字,可以包装成Integer吗?//不能,运行时会出现异常,编译时不会出现异常//Exception in thread "main" java.lang.NumberFormatException: For input string: "中文"//Integer a=new Integer("中文");//System.out.println(a);}}
图示(类型之间的转换有调用哪些方法):