1700440679
编写高质量代码:改善Java程序的151个建议 建议29:优先选择基本类型
1700440680
1700440681
包装类型是一个类,它提供了诸如构造方法、类型转换、比较等非常实用的功能,而且在Java 5之后又实现了与基本类型之间的自动转换,这使包装类型如虎添翼,更是应用广泛了,在开发中包装类型已经随处可见,但无论是从安全性、性能方面来说,还是从稳定性方面来说,基本类型都是首选方案。我们来看一段代码:
1700440682
1700440683
public class Client{
1700440684
1700440685
public static void main(String[]args){
1700440686
1700440687
Client cilent=new Client();
1700440688
1700440689
int i=140;
1700440690
1700440691
//分别传递int类型和Integer类型
1700440692
1700440693
cilent.f(i);
1700440694
1700440695
cilent.f(Integer.valueOf(i));
1700440696
1700440697
}
1700440698
1700440699
public void f(long a){
1700440700
1700440701
System.out.println(“基本类型的方法被调用”);
1700440702
1700440703
}
1700440704
1700440705
public void f(Long a){
1700440706
1700440707
System.out.println(“包装类型的方法被调用”);
1700440708
1700440709
}
1700440710
1700440711
}
1700440712
1700440713
在上面的程序中首先声明了一个int变量i,然后加宽转变成long型,再调用f()方法,分别传递int和long的基本类型和包装类型,诸位想想该程序是否能够编译?如果能编译输出结果又是什么呢?
1700440714
1700440715
首先,这段程序绝对是能够编译的。不过,说不能编译的同学还是很动了一番脑筋的,只是还欠缺点火候,你可能会猜测以下这些地方不能编译:
1700440716
1700440717
f()方法重载有问题。定义的两个f()方法实现了重载,一个形参是基本类型,一个形参是包装类型,这类重载很正常。虽然基本类型和包装类型有自动装箱、自动拆箱的功能,但并不影响它们的重载,自动拆箱(装箱)只有在赋值时才会发生,和重载没有关系。
1700440718
1700440719
cilent. f(i)报错。i是int类型,传递到fun(long l)是没有任何问题的,编译器会自动把i的类型加宽,并将其转变为long型,这是基本类型的转换规则,也没有任何问题。
1700440720
1700440721
cilent. f(Integer.valueOf(i))报错。代码中没有f(Integer i)方法,不可能接收一个Integer类型的参数,而且Integer和Long两个包装类型是兄弟关系,不是继承关系,那就是说肯定编译失败了?不,编译是成功的,稍后再解释为什么这里编译成功。
1700440722
1700440723
既然编译通过了,我们来看一下输出:
1700440724
1700440725
基本类型的方法被调用
1700440726
1700440727
基本类型的方法被调用
[
上一页 ]
[ :1.700440678e+09 ]
[
下一页 ]