我想测试我是否有两个constructors
其中一个params
为int
而另一个long
为public 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"。
答案 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)
版本更具体,因为int
是long
的子类型。
这确实有点令人困惑;如果可以,请避免使用它。