我有类似的东西:
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:找到了! A
和C
位于同一个包中,B
不是。
EDIT4:更新了示例,以制作最小,完整且可验证的示例。
答案 0 :(得分:0)
问题在于
B
与其他类不同,method
受到保护,因此只能通过继承和同一个包的类来显示,Test
类与[{1}}位于同一个包中,因此A
唯一可见的method
是C
继承的形式。 解决方案:在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 {
// …/…
}