我有两个内部类A,B和B是A的子类。我正在尝试访问 使用超级关键字的B的私有方法和字段,我得到输出。但是super关键字应该限制对私有字段和方法的访问。 这种行为的原因是什么?
public class C
{
public static class A
{
private int a = 10;
private void hello()
{
System.out.println("hello");
}
}
public static class B extends A
{
B()
{
super.hello();
System.out.println(super.a);
}
}
public static void main(String[] args)
{
B b = new B();
}
}
输出:
10
hello
答案 0 :(得分:1)
B
可以访问A
的私人成员,因为B
和A
都是C
的嵌套类,而不是因为B
是A
的子类。
访问规则并不关心如何获取引用,只关注代码是否在允许访问的上下文中。例如。如果将A
引用传递给B
方法,则它可以访问私有成员。在您的情况下,this
和super
都是A
的(隐式)引用。
子类无权访问其超类的私有成员。
答案 1 :(得分:1)
这里documentation说的是:
一个类继承自其直接超类和直接超接口 超类的所有非私有字段和超级接口 都可以访问类中的代码,而不是由a隐藏 在课堂上宣言。
子类可以访问超类的私有字段 - 例如,如果两个类都是同一个类的成员。 然而,私有字段永远不会被子类继承。
这意味着私有字段和方法不会被继承,但由于它们位于同一个类中,因此对其他类只是可见。例如,以下情况也很好:
public class C
{
public static class A
{
private int a = 10;
private void hello()
{
System.out.println("hello");
}
}
public static class B
{
B()
{
A a = new A();
a.hello();
System.out.println(a.a);
}
}
public static void main(String[] args)
{
B b = new B();
}
}