This question already has answers here:
How private method of super class are resolved?
(5个答案)
5年前关闭。
有人可以解释这种行为吗?是一个错误还是我遗漏了一些明显的东西?
1)在同一目录中创建2个软件包,例如pack1和pack2。
2)在pack1中创建X类
3)现在在pack2中创建一个Y类
Y类不应该使用方法eat,因为它具有“默认”访问说明符,该说明符将其可见性限制在声明的包(包X)中。因此,该方法在类Y中不可用。但是当我编译并执行此代码时,它可以正常工作。它不是对“默认”访问说明符的违反吗?
另外,如果我将X x = new Y()更改为Y x = new Y(),那么编译将失败!
从类X(在pack1中)到类Y(在pack2中)可以看到eat()不再可用。您将收到编译器错误消息
X类型的eat()方法不可见
2)同样,如果我将X x = new Y()更改为Y x = new Y(),那么编译将失败!
回答:
因为和以前一样,要访问的方法不在类Y中,而是在类X中。由于eat()方法具有默认的访问修饰符,因此无法通过继承使用。因此,由于变量现在的类型为Y(而不是X),因此您将无法再访问此方法。
(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),因此您将无法再访问此方法。