包装类提供了许多功能,而现在自动装箱功能,又方便了基本类型与包装类型的转换。但是从安全、性能、稳定方面考虑还是首选基本类型。
public class Test {
public static void main(String[] args)throws Exception {
Test test = new Test();
int i = 1;
test.f(i);
test.f(Integer.valueOf(i));
}
public void f(long a){
System.out.println("基本类型");
}
public void f(Long a){
System.out.println("包装类型");
}
}
上面的程序会能编译通过么?觉得会编译出错的人,可能会以下几个考虑。
1.方法重载有问题。
包装类型跟基本类型并不是同一类型。所以可以重载
2.test.f(i);报错。形参类型不正确。
int类型会自动转型为long。所以不会报错。
3.test.f(Integer.valueOf(i)); 报错。因为并没有Integer类型的形参。
实际上是不会报错的。运行结果如下:
基本类型
基本类型
第一个结果容易理解。第二个结果是因为,基本类型跟包装类型是可以转换的,编译器会尝试将Integer转换成int,结果就跟第一个一样了。
原建议中提到自动装箱的一个重要原则:
基本数据类型可以加宽,然后从加宽的基本类型再转成加宽的包装类型。不能直接转换从基本类型转换成加宽的包装类型。
比如:需要将int转成Long。首先int必须先加宽成long,然后才可以自动装箱成Long类型。不能直接从int类型转换成Long。
建议使用基本类型,防止出现上诉代码可读性差等原因。
public class Test {
public static void main(String[] args)throws Exception {
Test test = new Test();
int i = 1;
test.f(i);
test.f(Integer.valueOf(i));
}
public void f(long a){
System.out.println("基本类型");
}
public void f(Long a){
System.out.println("包装类型");
}
}
上面的程序会能编译通过么?觉得会编译出错的人,可能会以下几个考虑。
1.方法重载有问题。
包装类型跟基本类型并不是同一类型。所以可以重载
2.test.f(i);报错。形参类型不正确。
int类型会自动转型为long。所以不会报错。
3.test.f(Integer.valueOf(i)); 报错。因为并没有Integer类型的形参。
实际上是不会报错的。运行结果如下:
基本类型
基本类型
第一个结果容易理解。第二个结果是因为,基本类型跟包装类型是可以转换的,编译器会尝试将Integer转换成int,结果就跟第一个一样了。
原建议中提到自动装箱的一个重要原则:
基本数据类型可以加宽,然后从加宽的基本类型再转成加宽的包装类型。不能直接转换从基本类型转换成加宽的包装类型。
比如:需要将int转成Long。首先int必须先加宽成long,然后才可以自动装箱成Long类型。不能直接从int类型转换成Long。
建议使用基本类型,防止出现上诉代码可读性差等原因。