代码:1
class Ajay {
private void display() {
System.out.println("Ajay");
}
public static void main(String ...strings ){
Ajay r=new Ravi();
r.display();
}
}
class Ravi extends Ajay{
public void display() {
System.out.println("ravi");
}
}
CODE:2
class Ravi {
private void display() {
System.out.println("ravi");
}
}
public class Ajay extends Ravi{
public void display() {
System.out.println("ajay");
}
public static void main(String ...strings ){
Ravi r=new Ajay();
r.display();
}
}
我对上述两个代码有疑问。 CODE 1执行没有任何错误,而CODE 2抛出错误,如方法不可见。 这个错误的原因是什么?
答案 0 :(得分:4)
在第二个示例中,您尝试在display()
类型的变量上调用方法Ravi
。 Ravi
没有可从此位置访问的方法display()
(即Ajay
内)。
在第一个示例中,您可以在 display()
内的中调用Ajay
的私有Ajay
方法。请注意,调用private
方法不使用运行时多态性!要调用的确切代码是在编译时决定的!
答案 1 :(得分:1)
在代码2中,您在类Ravi中的显示方法是私有的。
现在你使用Ravi的引用“r”来调用display,但方法display()在类Ravi之外是不可见的。
即使你在Ajay类中使用与public相同的方法display(),但它没有覆盖超类,因为你无法降低可见性。
答案 2 :(得分:0)
错误消息与CODE2示例中的display
方法为private
的事实相关联,因此您无法调用它。
答案 3 :(得分:0)
为第二个代码提供解决方案选项:
如果要显示“ravi”,则可以将显示方法声明为:
class Ravi {
protected void display() {
System.out.println("ravi");
}
}
}
或者喜欢:
class Ravi {
public void display() {
System.out.println("ravi");
}
}
}
如果要显示“ajay”,请更改调用:
Ravi r=new Ajay();
if(r instanceof Ajay)
((Ajay) r).display();
}