让我们研究以下代码:
=> python
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar 6 2015, 12:06:10) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32console
>>> help(win32console.CreateConsoleScreenBuffer)
Help on built-in function CreateConsoleScreenBuffer in module win32console:
CreateConsoleScreenBuffer(...)
Creates a new console screen buffer
输出中:
public class App {
public static class A {
public void doSmth3(long a) {
System.out.println("This is doSmth3() in A...");
}
}
public static class B extends A {
public void doSmth3(int a) {
System.out.println("This is doSmth3() in B...");
}
}
public static void test(A a) {
a.doSmth3(1);
}
public static void main(String[] args) {
test(new B());
new B().doSmth3(3);
}
}
从我这边2行主要应该提供相同的结果,但结果是不同的。
我的意见This is doSmth3() in A...
This is doSmth3() in B...
应输出twise,因为它正在超载。
请解释输出
答案 0 :(得分:6)
简单:当Java编译器在a.doSmth3(1)
内看到对test(A)
的调用时,它只能将其编译为A#doSmth3(long)
的调用,这只是 方法可用。请注意,B#doSmth3(int)
是A#doSmth3(long)
的重载,而不是覆盖。
答案 1 :(得分:1)
类A
包含以下方法:
public void doSmth3(long a)
类B
包含以下方法:
public void doSmth3(long a) // Inherited from class A
public void doSmth3(int a) // This is an overload of doSmth3
当您致电a.doSmth3(1);
时,会使用A
类型引用a。因此,它必须使用long
参数调用方法。使用int
的另一种方法不适用于引用为A
的对象。
当您致电new B().doSmth3(3);
时,该对象将被引用为B
类型。它包含两种方法。由于您传递了int
值,因此它使用带有int
参数的方法。
答案 2 :(得分:0)
重载时,方法选择基于类型或参数,隐式转换类型的决定是在编译时进行的。因此,test(new B());
运行doSmth3(long)
,因为这是A
和
public static void test(A a) {
a.doSmth3(1);
}
必须选择A
可用的方法。
但是当您拨打new B().doSmth3(3);
时,您可以选择A
和B
的所有方法,而doSmth3(int)
中的B
更适合int
{1}}字面值比doSmth3(long)
。这就是您从B
打印的原因,因为您的输入是int
。