给出以下代码块:
public class Trial {
public static void main (String[] args){
B obj = new B();
obj.doMethod(); #prints "From A".
}
}
class A {
private void method(){System.out.print("from A");}
public void doMethod(){method();}
}
class B extends A {
public void method(){System.out.print("from B");}
public void doMethod(){super.doMethod();}
}
事实证明,调用了A类中的method()。为什么是这样?
答案 0 :(得分:2)
您以这种方式明确地实现它。 super
从基类A
public void doMethod(){super.doMethod();}
所以方法链是这样的:
B.doMethod() -> A.doMethod() -> A.method() -> "from A"
答案 1 :(得分:1)
我认为您的问题是,如果class A
private void method(){System.out.print("from A");}
是私有的,那么为什么要在class B
中打印“来自A”。
答案非常简单,你不能在任何其他类中调用A类的method()
。但你可以用它自己的对象来调用它。
当你调用super.doMethod();
时,它的super函数和method()
是它自己的方法,所以它可以调用它。
答案 2 :(得分:0)
因为,见下文:
class B extends A {
public void method(){System.out.print("from B");}
public void doMethod(){super.doMethod();}
}
在B组的doMethod()中,你使用super.doMethod()来攻击A类的doMethod()。所以很明显它是打印A级的doMethod()。
答案 3 :(得分:0)
您使用超级关键字调用doMethod。这意味着它将调用父实现 更多关于super keyword
答案 4 :(得分:0)
您的代码提供了简单的对象创建(B obj = new B();)和使用super的调用。超级用于父类提到的其他人。如果你尝试类似(A obj = new B();)这样的东西可能会有所不同,这更有趣。
答案 5 :(得分:0)
方法()是私有方法,私有方法不能被覆盖。当覆盖它时,最好使用@Override annotion。
class B extends A {
@Override
public void method(){System.out.print("from B");} // Compile error
}
如果您将方法更改为静态方法,则会发生类似情况。
class A {
public static void method(){System.out.print("from A");}
}
class B extends A {
public static void method(){System.out.print("from B");}
}