【问题标题】:Does private variables have the same access as package/default/no modifier variables in private classes?私有变量是否与私有类中的包/默认/无修饰符变量具有相同的访问权限?
【发布时间】:2012-05-22 03:13:04
【问题描述】:

私有变量是否与私有类中的包/默认/无修饰变量具有相同的访问权限?

public class PublicClass {

    public void test() {

        InnerClass in = new InnerClass();

        in.name1 = "a";
        in.name2 = "b";

        in.getName1();
        in.getName2();

    }

    private class InnerClass {

        private String name1;
        String name2;

        private String getName1() {
            return name1;
        }

        String getName2() {
            return name2;
        }

    }

}

方法test可以同时访问name1和name2,那么,在私有类的变量上设置private的目的是什么?

更新:private 关键字实际上如何禁止访问的代码示例会很棒。

【问题讨论】:

  • 变量不能互相访问。方法访问fields,你使用哪个变量或字段访问另一个类的字段或方法并不重要。
  • 内部类的变量访问修饰符主要在内部类为public/package private时生效,否则无所谓
  • 嗯,我什么时候说变量互相访问了?

标签: java variables private


【解决方案1】:

私有成员可在顶级封闭类中的任何位置访问,即PublicClass,如JLS 6.6.1 中所定义:

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

所以没有办法阻止方法访问内部类的私有成员。

由于你的内部类是私有的,你可以按照你想要的方式声明它的成员(包括公共的),它们只能在OuterClass 中访问。

【讨论】:

    【解决方案2】:

    private 表示/允许在同一个(顶级)类中访问。您正在使用内部类...

    来自 Java 语言规范:

    私有类成员或构造函数只能在顶级类的主体中访问(第 7.6 节)

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

    在这种情况下,在内部私有类中声明私有方法/字段确实没有多大用处。 如果您将 InnerClass 移到 PublicClass 的主体之外(仍然可以将它放在同一个文件中,但不能将类声明为私有),您会看到差异。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2011-05-14
      • 2011-07-21
      • 2023-04-03
      • 2015-09-25
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多