两个构造函数,int和long params在同一个类中

时间:2015-11-05 02:35:24

标签: java constructor

我想测试我是否有两个constructors其中一个paramsint而另一个longpublic class OverloadingExample { public OverloadingExample(int i, int j) { // TODO Auto-generated constructor stub System.out.println("Hello"+" "+(i+j)); } public OverloadingExample(long i, long j) { // TODO Auto-generated constructor stub System.out.println("long"+(i+j)); } public static void main(String[] args) { OverloadingExample duplicacyInHashMap = new OverloadingExample(20, 30); System.out.println(duplicacyInHashMap); } } 。在被叫时会执行哪一个?

我试过了:

Hello 50
OverloadingExample@6d06d69c

输出:

params 20,30

我相信两个被称为int的构造函数都是long以及labelClass类型。所以第二个构造函数的错误是什么它不打印"长50"。

2 个答案:

答案 0 :(得分:1)

如果您希望调用接受两个long值的构造函数,则需要显式传入long个变量:

public static void main(String[] args) {
    OverloadingExample duplicacyInHashMap1 = new OverloadingExample(20, 30);

    OverloadingExample duplicacyInHashMap2 = new OverloadingExample(20L, 30L);
}

<强>输出:

Hello 50
long50

<强>更新

更有趣的是当您传入一个int和一个long时会发生什么:

OverloadingExample duplicacyInHashMap3 = new OverloadingExample(20L, 30);

在这种情况下,我们得到输出long50,这意味着JVM将值30视为long。请注意,20L无法将int视为long,因为它明确为L值(以@include transition-timing-function(cubic-bezier(0.1, 0.57, 0.1, 1)) @include transition-duration(500ms) 结尾)并且强制转换可能导致$scroller.css({ 'transform': "translate(-" + scrollLeftPosition + "px, 0px) translateZ(0px)" }); 丢失精度。

答案 1 :(得分:1)

两个构造函数都适用。如果删除第一个,将使用第二个 - 我们可以将int参数传递给long参数。

由于两者都适用,编译器会选择最具体的一个。 (int)版本比(long)版本更具体,因为intlong的子类型。

这确实有点令人困惑;如果可以,请避免使用它。