关于Java:Java – 私有内部类公共成员

Java - private inner class public member

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

1
2
3
4
5
6
7
8
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",那么有什么区别(考虑到内部类是私有的,因此无法从"main"类的外部访问)?

重述

  • 属性是private:我可以从main访问它,但不能从外部main访问(因为内部是private)
  • 属性是公共的:我仍然可以从主目录访问它,但不能从外部主目录访问它(因为内部是私有的)

我看不出有什么不同


Inner是私有的,只能从Main内访问。即使a是公共的,但Inner是私有的,不能从特定的地方访问,a的属性也不相关。

1
2
3
4
5
6
7
8
class Main {
    private static class Inner {
        public static int a = 1;
    }
    public static void main(String[] args) {
        System.out.print(Inner.a);
    }
}

当你奔跑的时候,

1
1

Inner在同一类中是静态的(Main时,Inner及其所有成员始终可以从Main类中的任何地方访问。它是Main类之外的私有。如果我能进入

1
2
3
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.

或者更合理的例子

1
2
3
4
5
6
7
8
9
10
11
12
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私有化或公共化的区别,请考虑以下两个示例

1
2
3
4
5
6
7
8
9
10
11
12
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,它是不相关的,但是如果它作为下一个例子是在外部的,它将是重要的。


您可以将您的Inner类视为类级属性。将其设为私有将阻止在类外访问它。因为它是一个内部类,所以内部类的变量属于外部类,因此可以被外部类访问,而不管访问修饰符是什么。

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