一、前言(可忽略)
作者是一位自学JAVA的小白,通过网上视频学习和自己对包装类的理解,现将自己对包装类的认知描述如下:(希望能与各位同行好友共同分享自己所学的java知识,同时,也热切期望各位同行前辈能够帮助作者指出不足,让小白的编程技术能更上一层楼,感谢各位同行大佬。
二、包装类的认知
学过Java的帅锅都知道8种基本数据类型对应8种包装类型(长的也差不多,基本上都是首字母大写,除了int和char,英文有点长),8种包装类也属于引用数据类型,还有String也是(具体可看小白的String简介)。
为什么要提供8种包装类?
简单来说就是因为8种基本类型不够用(小白理解),JAVA是完全面向对象开发,在开发过程中,我们不可避免的使用到对象和多态,面向对象开发,也造成了我们对需要使用对应引用变量的基本数据类型常量的烦恼。
基本数据类型 包装类型
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)
三、包装类的爱与恨
装箱:基本数据类型转换成引用数据类型
手动装箱:
Integer i=new Integer(100);//照葫芦画瓢,i保存的是在堆内存中的Integer对象的内存地址,Integer对象指向整数常量地址池中的"100",
自动装箱:
Integer i=100;//照葫芦画瓢
拆箱:引用数据类型转换成基本数据类型
手动拆箱:
int j=i.intValue();//照葫芦画瓢
手动拆箱的方法:
* byte byteValue() 以byte形式返回指定的数值
* abstract double doubleValue 以double形式返回指定的数值
* abstract float floatValue()以float形式返回指定的数值
* abstract int intValue()以int形式返回指定的数值
* abstract long longValue()以long形式返回指定的数值
* short shortValue以short形式返回指定的数值
自动拆箱:
int j=i;//照葫芦画瓢
重点:
long Y=1000;
Long A=1000L;
System.out.println(Y==A);//引用数据类型与基本数据类型比较,自动拆箱,结果为true
Integer I=1000;
Float F=1000.0;
System.out.println(I==F);//提示出错,数值虽相同,但不同包装类型不可直接比较)
Integer X=100;
Integer C=100
System.out.println(X==C);//true,两对象的内存地址相同
```c
Integer M=100;
System.out.println(M+1);//true,包装类型的变量在进行四则运算时会自动拆箱
注意:为了提高程序的执行效率,Java将所有-128~127之间所有的包装对象都提前创建到了方法区的“整数型常量池中”,所以当使用"==“比较时,由于是使用”="直接赋内存地址(整数型常量池中的),所以两变量内存地址相同,结果为true
Integer H=100;
java.lang.Integer D=new java.lang.Integer(100);
System.out.println(H==D);//false D和H存放的内存地址不一样
java.lang.Integer x=1000;
java.lang.Integer b=0;
java.lang.Integer c=1000;
java.lang.Long N=1000L;
System.out.println(x.equals(c+b));//true, 先进行b和C的自动拆箱,求出b+c并自动装箱,再调用euqals方法进行对象引用的值比较。
System.out.println(N.equals(c+b));//false
java.lang.Integer K=1000;
java.lang.Integer Q=0;
java.lang.Long A=1000L;
System.out.println(A==(K+Q));首先A进行自动拆箱,K+Q由于进行四则运算自动拆箱,比较对象的值,由于JAVA在对类型转换时会自动向上转,int->long
注意:equals在比较不同包装类型时,由于类型不同会返回false
通过访问包装类的常量,来获取最大值和最小值(获取类型取值范围)
//比如int的取值范围
java.lang.Integer x=1000;
System.out.println(x.MIN_VALUE);//-2147483648
System.out.println(x.MAX_VALUE);//2147483647
四、包装类的异常
Long l=new Long("Chinese");
long I=l;
System.out.println(I);//异常报错:NumberFarmatException
//编译没错,但运行的时候会出现异常,只能是数字包装。
Long X=new Long("123");
long Y=X;
System.out.println(Y);//123
五、包装类的方法
static int parseInt(String s)
作用:静态方法,传参String,返回int,类名调用
int RetValue=java.lang.Integer.parseInt("123");//String->int,照葫芦画瓢
System.out.println(RetValue);//123
static String toBinaryString(int)
作用:静态,将int以十进制转化成二进制
System.out.println(java.lang.Integer.toBinaryString(10));//1010
static String toHexString(int x)
作用:静态,将int以十进制转化成十六进制
System.out.println(java.lang.Integer.toHexString(17));//11
static String toOctalString(int)
作用:静态,将int以十进制转换成八进制
System.out.println(java.lang.Integer.toOctalString(10));//12
static Integer valueOf(int i)
作用:静态,类型互转,将i以int转换成Integer
System.out.println(java.lang.Integer.valueOf(100));//100
static Integer valueOf(String x)
作用:静态,类型互转,将x以String转换成Integer
System.out.println(java.lang.Integer.valueOf("1000"));//1000,String只能以数字形式输入,否则报NumberFormatException错误