super关键字是否应该访问私有字段和方法。我可以访问私有方法和字段

时间:2017-11-29 20:01:44

标签: java

我有两个内部类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 

2 个答案:

答案 0 :(得分:1)

B可以访问A的私人成员,因为BA都是C嵌套类,而不是因为BA的子类。

访问规则并不关心如何获取引用,只关注代码是否在允许访问的上下文中。例如。如果将A引用传递给B方法,则它可以访问私有成员。在您的情况下,thissuper都是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();      
    }
}