Java-访问说明符

Java-Access Speficier

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

1)在同一目录下创建 2 个包,比如 pack1 和 pack2。

2)在 pack1 中创建一个 class 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 中创建一个 class Y

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

eat 方法不应该对 class Y 可用,因为它具有 'default' 访问说明符,限制了它对声明的包(包 X)的可见性。所以,这个方法不应该在 class Y 中可用。但是当我编译并执行这段代码时,它工作正常。这不是违反了 'default' 访问说明符吗?

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

[编辑]

1) class Y 不应该使用 eat 方法,因为它具有 'default' 访问说明符,限制了它对声明的包的可见性(包 X ).所以,这个方法不应该在 class Y.

中可用

答案: 您没有访问 Y 的 eat 方法,您正在访问 X 的 eat 方法。此外,您是从 X 的 main 方法调用它,这意味着它是可见的(调用在包 pack1 中)。

移码:

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

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

The method eat() from the type X is not visible

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

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