This question already has answers here:
How private method of super class are resolved?

(5个答案)


5年前关闭。




有人可以解释这种行为吗?是一个错误还是我遗漏了一些明显的东西?

1)在同一目录中创建2个软件包,例如pack1和pack2。

2)在pack1中创建X类

package pack1;
import pack2.*;
public class X
{
  void eat()
  {
   System.out.println("X eat");
  }

  public static void main(String args[])
  {
   X x = new Y();
   x.eat(); //accessing eat() method on Instance of Y.
   //But since eat() is not public or protected its visibility  must be limited to class X
   System.out.println("Done");
  }
}


3)现在在pack2中创建一个Y类

package pack2;
import pack1.*;
public class Y extends X
{
}


Y类不应该使用方法eat,因为它具有“默认”访问说明符,该说明符将其可见性限制在声明的包(包X)中。因此,该方法在类Y中不可用。但是当我编译并执行此代码时,它可以正常工作。它不是对“默认”访问说明符的违反吗?

另外,如果我将X x = new Y()更改为Y x = new Y(),那么编译将失败!

最佳答案

[编辑]

1)Y类不应该使用方法eat,因为它具有“默认”访问说明符,这限制了它对声明的包(包X)的可见性。因此,该方法在类Y中不可用。

回答:
您没有访问Y的eat方法,而是访问X的eat方法。而且,您是从X的main方法调用它的,这意味着它是可见的(该调用在pack1内)。

移动代码:

public static void main(String args[])
{
     X x = new Y();
     x.eat();
     System.out.println("Done");
}


从类X(在pack1中)到类Y(在pack2中)可以看到eat()不再可用。您将收到编译器错误消息


X类型的eat()方法不可见


2)同样,如果我将X x = new Y()更改为Y x = new Y(),那么编译将失败!

回答:
因为和以前一样,要访问的方法不在类Y中,而是在类X中。由于eat()方法具有默认的访问修饰符,因此无法通过继承使用。因此,由于变量现在的类型为Y(而不是X),因此您将无法再访问此方法。

10-07 13:06
查看更多