在下面的程序中,如果A中的msg()声明为public,则main()中的b.display()调用B&#39的msg()版本。但是,如果A中的msg()声明为private,则main()中的b.display()调用A的msg()版本。你能告诉我为什么会这样吗?
提前致谢。
class A {
private String msg() {
return "Message from class A";
}
void display() {
System.out.println(msg());
}
}
class B extends A {
public String msg() {
return "Message from class B's msg()";
}
}
class Tests {
public static void main(String args[]) {
B b = new B();
// private version of msg defined in A will be called
// if msg is defined as public in A, the version of msg defined in B is called
b.display();
// the version defined in B is called
System.out.println(b.msg());
}
}
答案 0 :(得分:1)
因为A的方法
private String msg() {
return "Message from class A";
}
是私人的。要覆盖它,它必须是公共的,在B上应该有@Override
符号,如此
class B extends A {
@Override
public String msg() {
return "Message from class B's msg()";
}
}
答案 1 :(得分:0)
简而言之,这是因为你不能覆盖私有方法--Java不允许它。
您可以将所有私有方法视为使用final
修饰符进行有效标记。
如果要确保方法已明确覆盖另一个方法,请使用@Override注释。通过在编译时抛出错误,这将让你知道它是否没有。
答案 2 :(得分:0)
因为在java中,扩展类只有可能的upconversion修饰符,而不是其他。对于代码Class A have method private msg()
中的expamle,扩展类make private msg() to public msg , msg() , and protected msg();
在您的情况下,您创建B b = new B()
并自然地调用b.display()
调用超级方法(因为您没有可能覆盖私有方法' s),而不是扩展。 b.msg()
来自b
,因为你压倒了它。