包装类
介绍
-
java中为8中基本数据类型又对应准备了8种包装类型。8中包装类属于引用数据类型,父类是Object。
-
思考:为什么要再提供8种包装类?
如:
//我们自己定义的一个包装类
public class MyInt {
private int value;
public MyInt() {
}
public MyInt(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
public class IntegerTest01 {
public static void main(String[] args) {
//有没有这种需求,调用dosome()方法时候,需要传递一个数字进去。
//但是数字属于基本数据类型,而dosome()方法参数的类型是Object。
//可见doSome()方法无法接受基本数据类型的数字。那么可以传一个数字对应的包装类进去。
MyInt mi=new MyInt(11);
dosome(mi);//11
}
public static void dosome(Object obj){
System.out.println(obj);
}
}
- 8种基本数据类型对应的包装类型名是什么?
基本数据类型 包装类型
-------------------------------------
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(父类Object)
以上八种包装类中,重点以java.lang.Integer为代表进行学习,其他类型类似。
拆箱与装箱
-
定义:
基本数据类型–(转换为)->引用数据类型(装箱)
将引用数据类型–(转换为)->基本数据类型(拆箱)public class IntegerTest02 { public static void main(String[] args) { //123这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换 //基本数据类型--(转换为)->引用数据类型(装箱) //JDK9之后不建议使用 Integer i=new Integer(123); //将引用数据类型--(转换为)->基本数据类型(拆箱) float f=i.floatValue(); System.out.println(f); } }
-
八种包装类中其中6个都是数字对应的包装类,他们的父类都是Number ,可以研究一下Number中公共的方法
Number是一个抽象类,无法实例化对象。
Number类中有这样的方法:byte byteValue() 以 byte 形式返回指定的数值。 abstract double doubleValue() 以 double 形式返回指定的数值。 abstract float floatValue() 以 float 形式返回指定的数值。 abstract int intValue() 以int 形式返回指定的数值。 abstract long longValue() 以long 形式返回指定的数值。 short shortValue() 以 short 形式返回指定的数值。 // 这些方法其实所有的数字包装类的子类都有,这些方法是负责拆箱的。
-
自动装箱和自动拆箱(在JDK1.5之后支持自动拆箱和自动装箱):
有了自动拆箱后,Number类中的方法就用不着了。
自动装箱和自动拆箱的好处:方便编程。
public class IntegerTest05 { public static void main(String[] args) { //自动装箱 //int类型-自动转换为->Integer Integer x=100; System.out.println(x);//100 //Integer类型-自动转换为->int //自动拆箱 int y=x; System.out.println(y);//100 //z是一个引用,z是一个变量,z还是保存了一个对象的内存地址。 Integer z=1000; //等同于:Integer z=new Integer(1000) //为什么这个没报错 //+两边要求是基本类型的数字,z是包装类,不属于基本数据类型。 //这里会进行自动拆箱,将z转换成基本数据类型 System.out.println(z+1);//1001 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 } }
-
面试题:
java中为了提高程序的执行效率,将**[-128,127]之间所有的包装对象提前创建好**,放到一个方法区的整数型常量池当中了,目的是只要用这个区间的数据,不需要再new了, 直接从整数型常量池当中取出来。(Integer类加载的时候,会初始化整数型常量池:256个对象)
原理:x变量保存的对象内存地址和y变量保存的对象内存地址是一样的。
public class IntegerTest06 { public static void main(String[] args) { Integer a=128; Integer b=128; System.out.println(a==b);//false /*java中为了提高程序的执行效率,将[-128,127]之间所有的包装对象提前创建好 放到一个方法区的整数型常量池当中了,目的是只要用这个区间的数据,不需要再new了 直接从整数型常量池当中取出来。 原理:x变量保存的对象内存地址和y变量保存的对象内存地址是一样的 */ Integer x=127; Integer y=127; //==永远判断的都是两个对象的内存地址是否相同 System.out.println(x==y);//true } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Dkp36Kx-1595315108127)(C:\Users\user\Desktop\Integer存储内存分析.png)]
Integer类
-
构造方法:
/* * 关于Integer类的构造方法 有两个 * Integer(int) * Integer(String) * */ public class IntegerTest03 { public static void main(String[] args) { //JDK9之后不建议使用这个构造方法,已过时 //将数字100转换为Integer包装类型 Integer x=new Integer(100); //将String类型的数据转换成Integer包装类型 Integer y=new Integer("123"); System.out.println(x);//100 System.out.println(y);//123 } }
-
通过访问包装类的常量,来获取最大值和最小值
public class IntegerTest04 { public static void main(String[] args) { //通过访问包装类的常量,来获取最大值和最小值 System.out.println("int的最大值:"+Integer.MAX_VALUE);//int的最大值:2147483647 System.out.println("int的最小值:"+Integer.MIN_VALUE);//int的最小值:-2147483648 System.out.println("byte的最大值:"+Byte.MAX_VALUE);//byte的最大值:127 System.out.println("byte的最小值:"+Byte.MIN_VALUE);//byte的最小值:-128 } }
-
常用方法
public class IntegerTest07 { public static void main(String[] args) { //手动装箱 Integer x=new Integer(1000); //手动拆箱 int y=x.intValue(); System.out.println(y); Integer a=new Integer("123"); //不是一个"数字"不能包装成Integer类 //java.lang.NumberFormatException //Integer b=new Integer("三"); System.out.println(a); //重点方法 //static int parseInt(String s) // 静态方法:传参String,返回int //网页上文本输入的100实际上是"100"字符串。后台数据库要求存储100数字 //此时java程序需要将"100"转换为100数字 int retValue= Integer.parseInt("123");//String-->int // int retValue1= Integer.parseInt("三");//java.lang.NumberFormatException System.out.println(retValue); //类似于parseInt double retValue2=Double.parseDouble("3.14"); System.out.println(retValue2+1); float retValue3=Float.parseFloat("1.8"); System.out.println(retValue3+1); //(了解) //静态的:将十进制转换为二进制字符串 String binaryString=Integer.toBinaryString(13); System.out.println(binaryString); //static String toHexString(int i) //静态的:将十进制转换为十六进制字符串 String hexString=Integer.toHexString(26); System.out.println(hexString); //static String toOctalString(int i) //静态的:将十进制转换为八进制字符串 String octalString=Integer.toOctalString(9); System.out.println(octalString); //valueof方法做了解 //static Integer valueOf(int i) //静态的:int->Integer Integer i=Integer.valueOf(1); System.out.println(i); //static Integer valueOf(String s) //静态的:String->Integer Integer i1=Integer.valueOf("1"); System.out.println(i1); } }
String ,int,Integer类型相互转化
public class IntegerTest04 {
public static void main(String[] args) {
int i2=1;
//int->String
String s=i+"";
String s1= String.valueOf(i2);
//String->int
String s2="111";
int i3=Integer.parseInt(s2);
//int->Integer
Integer i4=i2;
Integer i5= Integer.valueOf(i2);
//Integer->int;
int i6=i4;
int i7=i4.intValue();
//String->Integer
Integer i8=Integer.valueOf("1");
//Integer->String
String s3=String.valueOf(i4);
}
}
如图: