Java-私有(private)内部类公共(public)成员

标签 java class nested private member

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

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

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

回顾一下

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

我看不出有什么区别

最佳答案

Inner 是私有(private)的,只能从 Main 内部访问。即使 a 是公共(public)的,但 Inner 是私有(private)的并且无法从特定位置访问,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 类之外是私有(private)的。如果我要访问

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 设为私有(private)或公开的区别,请考虑以下两个示例

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 中,就无关紧要,但如果它位于外部(如下一个示例所示),则很重要。

关于Java-私有(private)内部类公共(public)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161367/

相关文章:

java - 为什么我无法使用 Ubuntu 编译 Java 应用程序?

java - 是否有某种 'assertion' 覆盖工具(用于 Java)?

javascript - 根据多个key对json进行分组

ruby 。合并嵌套哈希而不覆盖

java - 将摩尔斯电码翻译成字母

java - Android studio fragment 或新 Activity

reactjs - 禁用非 defaultChecked 项目的复选框

c++ - 传递对象还是创建新对象?

c++ - 子类作为类方法的返回类型

sql - 访问postgresql中的列别名