Java重载和继承方法选择

时间:2015-10-23 16:22:32

标签: java inheritance overloading

让我们研究以下代码:

=> 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,因为它正在超载。

请解释输出

3 个答案:

答案 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);时,您可以选择AB的所有方法,而doSmth3(int)中的B更适合int {1}}字面值比doSmth3(long)。这就是您从B打印的原因,因为您的输入是int