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),您不能再访问此方法。
有人可以解释这种行为吗?这是一个错误还是我遗漏了一些明显的东西?
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),您不能再访问此方法。