为啥子类可以访问具有内部类的超类的私有成员?

Posted

技术标签:

【中文标题】为啥子类可以访问具有内部类的超类的私有成员?【英文标题】:Why does a subclass have access to a private member of the superclass with inner classes?为什么子类可以访问具有内部类的超类的私有成员? 【发布时间】:2019-05-12 04:13:34 【问题描述】:
    public class Main 
    static class Article 
        // Price in Article, private!
        private float price;

        Article(float price) 
            this.price = price;
        
    

    static class Milk extends Article 

        Milk(float price) 
            super(price);
            //Has access to private price
            System.out.println(super.price);
        
    

    public static void main(String[] args) 
        new Main.Milk(1.5f);

    

在本例中,子类可以通过 super.price 访问私有成员 access specifiers in inner classes是什么意思?

【问题讨论】:

"内部类中的访问说明符是什么意思?"他们仍然控制其他代码的访问。无需将其隐藏在同一封闭类中的代码中。将代码分组到嵌套类的主要动机之一是允许它们紧密耦合(而不会将这些东西泄漏到包范围内)。 【参考方案1】:

来自JLS 6.6.1:

否则,成员或构造函数被声明为private,并且当且仅当它出现在包含成员或构造函数声明的***类型(第 7.6 节)的主体内时才允许访问。

因此,嵌套类可以访问其***类的私有成员,反之亦然。出于所有实际目的,私有成员可以在当前.java 文件中完全访问。

【讨论】:

A nested class can thus access private members of its top-level class and vice versa - 不过,这不是 OP 代码中发生的情况。私有成员属于一个嵌套类,可以从另一个嵌套类访问。也就是说,这个 JLS 引用仍然适用。

以上是关于为啥子类可以访问具有内部类的超类的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 私有内部类的私有成员与默认成员

内部类的使用类型

各种内部类的总结

成员内部类的优点

内部类

27 内部类的使用