Java_语法基础_优先选择基本类型

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

package deep;

public class Client {

    public static void main(String[] args) {
        Client client = new Client();
        int i = 140;
        // 分别传递int类型和Integer类型
        client.f(i);
        client.f(Integer.valueOf(i));
    }

    private void f(long i) {
        System.out.println("基本类型的方法被调用");
    }

    private void f(Long i) {
        System.out.println("包装类型的方法被调用");
    }
}

运行结果:
基本类型的方法被调用
基本类型的方法被调用

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

package deep;

public class Client {

    public static void main(String[] args) {
        int i = 140;
        f(i);
    }

    private static void f(Long i) {
    }

}

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

package deep;

public class Client {

    public static void main(String[] args) {
        int i = 140;
        long l = (long) i;
        f(l);
    }

    private static void f(Long i) {
    }

}

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

  • i通过valueOf方法包装成一个Integer对象。
  • 由于没有f(Integer i)方法,编译器“聪明”地把Integer对象转换成int
  • int自动拓宽为long,编译结束

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值