目录
2.包装器类是一个引用数据类型,具备之前的引用数据类型的所有特征。
1.jdk9以前:(new 类名()和包装器对象名.基本数据类型名Value())
2.jdk9以后:(valueOf()和基本数据类型名Value())
2.没有最精确的方法,就分为基本数据类型和包装器两种来分开考虑
1.什么是包装器类
1.Object类仅针对于抽象数据类型有相关操作,对于基本数据类型没有相关操作,所以提供了包装器类把基本数据类型包装成为了一个引用数据类型,这种转换后的引用数据类型就叫包装器类
2.不同的基本数据类型对应哪些包装器类
基本数据类型 | 类名 | 基本数据类型占据的空间(字节) |
int | java.lang.Integer | 4 |
byte | java.lang.Byte | 1 |
short | java.lang.Short | 2 |
long | java.lang.Long | 8 |
double | java.lang.Double | 8 |
float | java.lang.Float | 4 |
char | java.lang.Character | 2 |
boolean | java.lang.Boolean | 1 |
3.Integer类
1.Integer类是int类型的包装器类
2.包装器类是一个引用数据类型,具备之前的引用数据类型的所有特征。
3.装箱和拆箱:
装箱:从基本数据类型打包成引用数据类型 基本数据类型--->引用数据类型
拆箱:从引用数据类型中提取基本数据类型 引用数据类型--->基本数据类型
1.jdk9以前:(new 类名()和包装器对象名.基本数据类型名Value())
1.创建一个包装器类型的对象(装箱)
Integer a = new Integer(100);
由于new的方式会开辟出来空间,所以假如两个Integer对象都使用new创建对象。直接使用判等的话会导致地址进行比较,结果会为false,只有使用equals才有可能结果为true
public class Run{
public static void main(String[] args){
Integer one = new Integer(9);
Integer two = new Integer(9);
System.out.println(one==two);
System.out.println(one.equals(two));
}
}
运行结果为:
false
true
2.获取基本数据类型(拆箱):
intValue方法返回int类型的数据
public class Run{
public static void main(String[] args){
Integer one = new Integer(9);
Integer two = new Integer(9);
System.out.println(one==two);
System.out.println(one.equals(two));
//获取基本数据类型:
int a = one.intValue();
}
}
2.jdk9以后:(valueOf()和基本数据类型名Value())
1.装箱
Integer 变量名 = Integer.valueOf(值);
3.拆箱
int a = Integer变量.intValue();
假设现在有一个Integer num = Integer.valueOf(250);
方法名 | 性质 | 形参 | 返回值 | 例子 |
valueOf | 静态 | 基本数据类型 | 形参对应的包装器类型 | Integer a = Integer.valueOf(3); |
基本数据类型名Value | 非静态 | 无 | 对应的基本数据类型 | int a = num.intValue(); |
4.自动装箱与自动拆箱:
1.自动装箱:就是把基本数据类型直接赋值给Integer变量
2.自动拆箱:直接对Integer对象进行加减乘除等运算
3.自动拆装箱的条件:进行+-*/以及++--运算还有赋值运算的时候才会自动拆装箱
//自动装箱
Integer a =3;
//自动拆箱
int b = a;
System.out.println("a中的数据:"+a.intValue());
System.out.println("自动拆箱的结果:"+b);
5.String,Integer,int三者之间的转化
转化 | 所用方法 |
String->Integer | valueOf(字符串) |
int->Integer | valueOf(int类型的数据)或者自动装箱 |
Integer->String | valueOf(Integer对象) |
Integer->int | intValue()或者自动拆箱 |
自动装箱的时候还会new一个新的对象,除非是在常量池里已有的值
2.方法重载的时候的选择
1.优先加载参数列表对应的最精确的方法
2.没有最精确的方法,就分为基本数据类型和包装器两种来分开考虑
如果是基本数据类型,则先匹配自动类型转换的结果,后匹配自动装箱
如果是包装器类型,就先匹配自动拆箱的结果,后先拆箱再匹配自动类型转换
对于第三种情况而言,就是说,如果前两种不满足,那么只会匹配形参是基本数据类型的方法,包装器类型的形参方法不可匹配
public class NewWays {
//体现精确查找的
public void show(int i){
System.out.print("\t调用int\t");
}
public void show(Integer i){
System.out.print("\t调用Integer\t");
}
//体现没有精确就查找对应拆装箱类型的
public void show1(int i){
System.out.print("\t没有形参为int则进行自动拆箱查找的方法\t");
}
public void show2(Integer i){
System.out.print("\t没有形参为Integer则进行自动装箱查找的方法\t");
}
//第三种情况
public void show3(int i){
System.out.print("\tshort/Short自动类型转换加载形参是int的");
}
public void show3(Integer i){
System.out.print("\tshort/Short自动类型转换且装箱加载Integer的");
}
//此处是比较到底先加载包装器还是自动类型转换
public void show4(int i){
System.out.print("\t优先加载自动类型转换对应的方法\t");
}
public void show4(Short i ){
System.out.print("\t优先加载包装器拆装箱对应的方法\t");
}
public static void main(String[] args) {
//方法重载相关代码:
NewWays run = new NewWays();
int intDate = 10;
Integer integerDate = 20;
System.out.println("\n\n接下来是方法重载部分的内容:\n1.这两个体现的是优先加载最精确的类型");
run.show(intDate);
run.show(integerDate);
System.out.println("\n2.接下来体现的是如果没有最精确的类型如何加载对应的拆装箱类型");//从某种意义上来讲可以理解为int和Integer互为对方子类,但是绝对不是子类啊!!!只是记忆理解这样子才可以让形参这个父类的引用指向子类对象来使用,实参传递子类
run.show1(integerDate);//本应该是int,但是这里自动拆箱
run.show2(intDate);//本应该是Integer。但是这里自动装箱
System.out.println("\n3.接下来体现的是没有精确类型,加载(拆箱后)自动类型转换后的类型匹配的方法");//加载形参的时候查找自动类型转换后的基本数据类型,在这里包装器类型也只能转换成基本数据类型来加载方法,说白了只转换一次
short f = 5;
Short s =1;
run.show3(f);//这里f自动转int,short也是无法转Integer,只可以转int
run.show3(s);//这里Short自动转int,Short无法转Integer,只可以转int
System.out.println("\n4.接下来体现的是如果既有对应的包装器类型形参又有对应的自动类型转换的类型如何匹配");//先匹配自动类型转换的
short mm = 4;
Short nn = 2;
run.show4(mm);
run.show4(nn);
System.out.println("\n方法重载结束\n\n\n\n");
}
}
接下来是方法重载部分的内容:
1.这两个体现的是优先加载最精确的类型
调用int 调用Integer
2.接下来体现的是如果没有最精确的类型应该加载对应的拆装箱类型
没有形参为int则进行自动拆箱查找的方法 没有形参为Integer则进行自动装箱查找的方法
3.接下来体现的是没有精确类型和自动拆装箱类型时,加载(拆箱后)自动类型转换后的类型匹配的方法
short/Short自动类型转换加载形参是int的 short/Short自动类型转换加载形参是int的
4.接下来体现的是如果既有对应的包装器类型形参又有对应的自动类型转换的类型如何匹配
优先加载自动类型转换对应的方法 优先加载包装器拆装箱对应的方法
方法重载结束
4.综合代码
public static void main(String[] args){
Integer one = new Integer(9);
Integer two = new Integer(9);
System.out.println("one和two比较 :"+(one==two));//one和two地址不同所以是false
System.out.println(one.equals(two));//包装器类的equals方法比较的是值
Integer three = Integer.valueOf(9);
Integer four = Integer.valueOf(9);
System.out.println("three和four比较:"+(three == four));//此时的结果是true,因为拥有了常量池,这两个的值在常量池当中
System.out.println(three.equals(four));//包装器类的equals方法比较的是值
//自动装箱
Integer a = 3;
Integer c = 3;
//自动拆箱
int b = a;
System.out.println(a==c);//也是和常量池是一样的
System.out.println("a中的数据:"+a.intValue());
System.out.println("自动拆箱的结果:"+b);
//包装器类与String转化
//String-->Integer
Integer strInt = Integer.valueOf("1234");
//Integer-->String
String str = String.valueOf(strInt);
System.out.println("String-->Integer:"+strInt);
System.out.println("Integer-->String"+str);
//方法重载相关代码:
Run run = new Run();
int intDate = 10;
Integer integerDate = 20;
System.out.println("\n\n接下来是方法重载部分的内容:\n1.这两个体现的是优先加载最精确的类型");
run.show(intDate);
run.show(integerDate);
System.out.println("\n2.接下来体现的是如果没有最精确的类型应该如何加载对应的拆装箱类型");//从某种意义上来讲可以理解为int和Integer互为对方子类,但是绝对不是子类啊!!!只是记忆理解这样子才可以让形参这个父类的引用指向子类对象来使用,实参传递子类
run.show1(integerDate);//本应该是int,但是这里自动拆箱
run.show2(intDate);//本应该是Integer。但是这里自动装箱
System.out.println("\n3.接下来体现的是加载(拆箱后)自动类型转换后的类型匹配的方法");//加载形参的时候查找自动类型转换后的基本数据类型,在这里包装器类型也只能转换成基本数据类型来加载方法,说白了只转换一次
short f = 5;
Short s =1;
run.show3(f);//这里f自动转int,short也是无法转Integer,只可以转int
run.show3(s);//这里Short自动转int,Short无法转Integer,只可以转int
System.out.println("\n4.接下来体现的是如果既有对应的包装器类型形参又有对应的自动类型转换的类型如何匹配");//先匹配自动类型转换的
short mm = 4;
Short nn = 2;
run.show4(mm);
run.show4(nn);
System.out.println("\n方法重载结束\n\n\n\n");
//其他类型的包装器类举例
Long longDate =new Long (12);
System.out.println("longDate调用拆箱的方法的结果: "+longDate.longValue());//此处是拆箱
System.out.println("longDate调用toString方法的结果:"+longDate);//此处是toString方法的使用
Long longDate1 = 100L;//自动装箱
longDate1++;//自动拆箱并进行运算
System.out.println("++运算后的longDate1:"+longDate1.longValue());
Long strlong = Long.valueOf("12312312");//String-->Long
String str1 = String.valueOf(strlong);//Long-->String
System.out.println("Long-->Integer:"+strInt);
System.out.println("Integer-->Long:"+str);
}
//体现精确查找的
public void show(int i){
System.out.print("\t调用int\t");
}
public void show(Integer i){
System.out.print("\t调用Integer\t");
}
//体现没有精确就查找对应拆装箱类型的
public void show1(int i){
System.out.print("\t没有形参为int则进行自动拆箱查找的方法\t");
}
public void show2(Integer i){
System.out.print("\t没有形参为Integer则进行自动装箱查找的方法\t");
}
//第三种情况
public void show3(int i){
System.out.print("\tshort/Short自动类型转换加载形参是int的");
}
public void show3(Integer i){
System.out.print("\tshort/Short自动类型转换且装箱加载Integer的");
}
//此处是比较到底先加载包装器还是自动类型转换
public void show4(int i){
System.out.print("\t优先加载自动类型转换对应的方法\t");
}
public void show4(Short i ){
System.out.print("\t优先加载包装器拆装箱对应的方法\t");
}
运行结果:
one和two比较 :false
true
three和four比较:true
true
true
a中的数据:3
自动拆箱的结果:3
String-->Integer:1234
Integer-->String1234
接下来是方法重载部分的内容:
1.这两个体现的是优先加载最精确的类型
调用int 调用Integer
2.接下来体现的是如果没有最精确的类型应该如何加载对应的拆装箱类型
没有形参为int则进行自动拆箱查找的方法 没有形参为Integer则进行自动装箱查找的方法
3.接下来体现的是加载(拆箱后)自动类型转换后的类型匹配的方法
short/Short自动类型转换加载形参是int的 short/Short自动类型转换加载形参是int的
4.接下来体现的是如果既有对应的包装器类型形参又有对应的自动类型转换的类型如何匹配
优先加载自动类型转换对应的方法 优先加载包装器拆装箱对应的方法
方法重载结束
longDate调用拆箱的方法的结果: 12
longDate调用toString方法的结果:12
++运算后的longDate1:101
Long-->Integer:1234
Integer-->Long:1234