Java方法没有重载

时间:2017-03-23 14:31:34

标签: java inheritance override

我有类似的东西:

A.java:

package project;
public class A {
    protected void method(A param){
        System.out.println("A");
    }
}

B.java:

package project.sub;
import project.A;
public class B extends A {
    protected void method(B param){
        System.out.println("B");
    }
}

C.java:

package project;
import project.sub.B;
public class C extends B {
    // …/…
}

Test.java:

package project;
public class Test {
    public static void main(String args[]) {
        C c1 = new C(), c2 = new C();
        c1.method(c2); // prints "A"
    }
}

现在,当我在method的实例上调用C时,我希望看到“B”,但是打印的是“A”。

method无法覆盖,因为它不是相同的签名。我怎样才能确保它是被调用的B实现。

编辑:我知道它应该打印“B”。所以我的问题也可能是:它可能是什么原因。

EDIT2:如果我在method上实施C,它就会正常工作。我仍然不明白为什么。

public class C extends B {
    public void method(C param) {
        super.method(param);
    }
}

EDIT3:找到了! AC位于同一个包中,B不是。

EDIT4:更新了示例,以制作最小,完整且可验证的示例。

3 个答案:

答案 0 :(得分:0)

问题在于

  1. class B与其他类不同,
  2. method受到保护,因此只能通过继承和同一个包的来显示,
  3. Test类与[{1}}位于同一个包中,因此A唯一可见的methodC继承的形式。
  4. 解决方案:在A类中显示B.method,在Test上将其更改为public,或在B上重新实现:

    C

答案 1 :(得分:-1)

类的构造函数有一个super()默认调用其父构造函数。你必须看到" A"因为你的根类印刷" A"在它的构造函数中。 你说你的程序显示A因为不在同一个包中!这不是真的。 但是,每个类的构造函数都有一个调用父构造函数的super(),你应该知道我们是否没有为它有一个默认构造函数的类定义任何构造函数,如果我们通过define处理这个项,它可能会有所帮助一个正确的构造函数。

答案 2 :(得分:-2)

再试一次。它的印刷品B

public class App {
    public static void main(String[] args) {
        C c1 = new C(), c2 = new C();
        c1.method("");
    }
}

class A {
    protected void method(String param){
        System.out.println("A");
    }
}

class B extends A {
    protected void method(String param){
        System.out.println("B");
    }
}

class C extends B {
    // …/…
}