课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java程序:优先选择基本类型
  • java程序:优先选择基本类型

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 昆明Java培训的老师知道,包装类型是一个类,它提供了诸如构造方法,类型转换,比较等非常实用的功能,而且在Java5之后又实现了与基本类型的转换,这使包装类型如虎添翼,更是应用广泛了,在开发中包装类型已经随处可见,但无论是从安全性、性能方面来说,还是从稳定性方面来说,基本类型都是首选方案。我们看一段代码:

    1 public class Client29 {

    2    public static void main(String[] args) {

    3        Client29 c = new Client29();

    4        int i = 140;

    5        //分别传递int类型和Integer类型

    6        c.testMethod(i);

    7        c.testMethod(new Integer(i));

    8    }

    9

    10    public void testMethod(long a) {

    11        System.out.println("基本类型的方法被调用");

    12    }

    13

    14    public void testMethod(Long a) {

    15        System.out.println("包装类型的方法被调用");

    16    }

    17 }

    在上面的程序中首先声明了一个int变量i,然后加宽转变成long型,再调用testMethod()方法,分别传递int和long的基本类型和包装类型,诸位想想该程序是否能够编译?如果能编译,输出结果又是什么呢?

    首先,这段程序绝对是能够编译的。不过,说不能编译的同学还是动了一番脑筋的,你可能猜测以下这些地方不能编译:

    (1)、testMethod方法重载问题。定义的两个testMethod()方法实现了重载,一个形参是基本类型,一个形参是包装类型,这类重载很正常。虽然基本类型和包装类型有自动装箱、自动拆箱功能,但并不影响它们的重载,自动拆箱(装箱)只有在赋值时才会发生,和编译重载没有关系。

    (2)、c.testMethod(i)报错。i是int类型,传递到testMethod(long a)是没有任何问题的,编译器会自动把i的类型加宽,并将其转变为long型,这是基本类型的转换法则,也没有任何问题。

    (3)、c.testMethod(new Integer(i))报错。代码中没有testMethod(Integer i)方法,不可能接收一个Integer类型的参数,而且Integer和Long两个包装类型是兄弟关系,不是继承关系,那就是说肯定编译失败了?不,编译时成功的,稍后再解释为什么这里编译成功。

    既然编译通过了,我们看一下输出:

    基本类型的方法被调用

    基本类型的方法被调用

    c.testMethod(i)的输出是正常的,我们已经解释过了,那第二个输出就让人困惑了,为什么会调用testMethod(long a)方法呢?这是因为自动装箱有一个重要原则:基本类型可以先加宽,再转变成宽类型的包装类型,但不能直接转变成宽类型的包装类型。这句话比较拗口,简单的说就是,int可以加宽转变成long,然后再转变成Long对象,但不能直接转变成包装类型,注意这里指的都是自动转换,不是通过构造函数生成,为了解释这个原则,我们再来看一个例子:

    1 public class Client29 {

    2    public static void main(String[] args) {

    3        Client29 c = new Client29();

    4        int i = 140;

    5        c.testMethod(i);

    6    }

    7

    8    public void testMethod(Long a) {

    9        System.out.println("包装类型的方法被调用");

    10    }

    11 }

    这段程序的编译是不通过的,因为i是一个int类型,不能自动转变为Long型,但是修改成以下代码就可以通过了:

    int i = 140; long a =(long)i;c.testMethod(a);

    这就是int先加宽转变成为long型,然后自动转换成Long型,规则说明了,我们继续来看testMethod(Integer.valueOf(i))是如何调用的,Integer.valueOf(i)返回的是一个Integer对象,这没错,但是Integer和int是可以互相转换的。没有testMethod(Integer i)方法?没关系,编译器会尝试转换成int类型的实参调用,Ok,这次成功了,与testMethod(i)相同了,于是乎被加宽转变成long型---结果也很明显了。整个testMethod(Integer.valueOf(i))的执行过程是这样的:

    (1)、i通过valueOf方法包装成一个Integer对象

    (2)、由于没有testMethod(Integer i)方法,编译器会"聪明"的把Integer对象转换成int。

    (3)、int自动拓宽为long,编译结束

    使用包装类型确实有方便的方法,但是也引起一些不必要的困惑,比如我们这个例子,如果testMethod()的两个重载方法使用的是基本类型,而且实参也是基本类型,就不会产生以上问题,而且程序的可读性更强。自动装箱(拆箱)虽然很方便,但引起的问题也非常严重,我们甚至都不知道执行的是哪个方法。

    昆明Java培训的老师提醒大家注意:重申,基本类型优先考虑。

    推荐文章

上一篇:优先使用整型池

下一篇:java里不要随便设置随机种子

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56