Java - 私有内部类公共成员

时间:2014-04-18 19:59:14

标签: java class nested private member

访问级别修饰符如何更改内部私有类中成员的行为? 我有这个代码

class Main {
    private static class Inner {
        private static int a = 1;
    }
    public static void main(String[] args) {
        System.out.print(Inner.a);
    }
}

我可以访问属性" a"从外层来看,它的访问级别是公共的还是私有的(这对我来说已经很奇怪了)。 问题是:如果属性是" public static int ",差异是什么(考虑到内部class是私有的,因此无法从" Main"类的外部访问?

回顾一下

  • 该属性是私有的:我可以从Main访问它,但不能从Main外部访问(因为Inner是私有的)
  • 属性是公共的:我仍然可以从Main访问它,但不能从Main外部访问它(因为Inner是私有的)

我看不出差异

2 个答案:

答案 0 :(得分:1)

Inner是私有的,只能在Main内访问。即使a是公开的,但Inner是私有的且无法从特定位置访问,a的属性也无关紧要。

class Main {
    private static class Inner {
        public static int a = 1;
    }
    public static void main(String[] args) {
        System.out.print(Inner.a);
    }
}

当你跑步时,

1

每当Inner在同一个类中是静态的时,(Main),Inner(及其所有成员)始终可以从Main类的任何位置访问。它在Main类之外是私有的。如果我要访问

Main main = new Main();
main.Inner; // Compilation Failure. Inner is not accessible
// Technically I would never do new Main(), but to illustrate I am doing so.

或者是一个更合理的例子

class Main {
    public static void main(String[] args) {
        System.out.print(SomeClass.Inner);
    }
}

class SomeClass{
    private static class Inner {
        public static int a = 1;
    }

}

为了说明使a私有或公开的区别,请考虑以下两个例子

class Main {
    public static void main(String[] args) {
        System.out.print(SomeClass.Inner.a);
    }
}

class SomeClass{
    public static class Inner {
        private static int a = 1;  // If a is private, it produces an error above
      //public static int a = 1; // This would not be an error
    }
}

因此,在您的特定情况下,只要它在同一个类Main中,它就无关紧要,但如果它在下一个示例之外,那就很重要了。

答案 1 :(得分:0)

您可以将Inner类视为类级属性。将其设为私有会阻止在类外部访问它。由于它是一个内部类,因此内部类的变量属于外部类,因此无论访问修饰符如何,外部类都可以访问它们。

http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html