【问题标题】:Private access modifier for methods in nested classes嵌套类中方法的私有访问修饰符
【发布时间】:2020-08-23 19:32:46
【问题描述】:

请考虑以下代码 sn-p。

public class HelloWorld{

    private static class InnerA{
        private int _a;

        private InnerA( int a ){
            _a = a;
        }

        private int getA(){
            return _a;
        }

    }

    private static class InnerB{
        private InnerB(){
            InnerA inner_a = new InnerA( 1 ); //isn't the constructor of InnerA private??
            System.out.println( inner_a.getA() ); //isn't getA() a private function of InnerA??
        }

    }
    public static void main(String []args){
       InnerB b = new InnerB();
    }
}

我的问题是:

  1. InnerA的构造函数被标记为私有,但是为什么从InnerB的构造函数内部调用成功呢?

  2. 为什么getA()InnerA的私有方法可以被调用 从内部InnerB?我认为将方法标记为私有 会阻止它在InnerA之外使用?

【问题讨论】:

    标签: java access-modifiers


    【解决方案1】:

    来自language spec

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

    同一个顶级类中的东西总是可以访问的。

    【讨论】:

      【解决方案2】:

      嵌套的静态类可以访问其封闭类的所有成员,包括私有成员。

      他们无法访问其封闭实例的公共或私有实例成员。但是,如果将静态嵌套类的方法传递给封闭类的实例,则嵌套类将能够访问封闭类的所有成员,而不管它们的访问级别如何。

      【讨论】:

        【解决方案3】:

        documentation 说:

        嵌套类是其封闭类的成员。非静态嵌套 类(内部类)可以访问封闭的其他成员 类,即使它们被声明为私有。

        【讨论】:

          猜你喜欢
          • 2011-05-03
          • 2014-08-27
          • 2017-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          • 2020-11-01
          • 2015-12-02
          • 1970-01-01
          相关资源
          最近更新 更多