【问题标题】:Java - private inner class public memberJava - 私有内部类公共成员
【发布时间】:2014-06-03 09:23:00
【问题描述】:

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

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”,区别是什么(考虑到 Inner 类是私有的,因此无法从“Main”类的外部)?

回顾

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

我看不出有什么区别

【问题讨论】:

  • 你是对的,因为Inner是私有的,它只能从Main内部访问。即使a 是公共的,但Inner 是私有的,不能从特定位置访问,a 的属性也将无关紧要。

标签: java class nested private member


【解决方案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 中,就无关紧要,但如果它在下一个示例中,则很重要。

【讨论】:

  • 好的,但是公开私有内部类的属性有什么区别?
  • Inner为private时,将属性设为public有什么区别?
  • 当Inner 与Main 属于同一类时:public 或private 无关紧要,只要您属于Main 类。 shar.es/TjDcx
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 2014-01-01
    • 2017-12-22
    • 2013-10-10
    • 2011-09-10
    • 2016-04-30
    • 2015-05-04
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多