【问题标题】:java private access modifier can be accessed out side of the class?java private 访问修饰符可以在类之外访问吗?
【发布时间】:2012-04-19 22:49:58
【问题描述】:

为什么java编译器不限制访问其他类的私有属性? 我有一个内部类,它有一个带有修饰符“private”的属性“a”。我可以在类之外使用它的实例变量访问这个变量。请看下面的代码。

package com.test;

public class Test {

    public Test() {
    }

    public static void main(String[] args) {
        new Test().execute(); // test method
    }

    public void execute() {
        InnerClass innerClassInstance = new InnerClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerClassInstance.a);

        InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerStaticClassInstance.a);
    }

    private final class InnerClass {
        private int a; // accessible only in InnerClass??
    }

    private final static class InnerStaticClass {
        private int a; // accessible only in InnerClass??
    }
}

【问题讨论】:

标签: java oop


【解决方案1】:

罢工>

嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有

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

抱歉,我看错了问题。

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

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

因此,内部类中的字段(显然在类体内)可以被外部类访问,即使它是私有的。

【讨论】:

  • 是的,这可以解释为什么 InnerClass 可以访问 Test 的任何成员,但这不是 OP 所要求的。有趣的是,@Howard 链接到的问题中接受的答案犯了同样的错误。
【解决方案2】:

这些nested classes 就是为此而设计的。当您拥有私人 类中的成员,我们编写嵌套类来进行单元测试。

【讨论】:

    【解决方案3】:

    您的 Inner 类是您的 Test 类的成员,因此,Test 类也可以访问 Inner 类的私有成员。

    这样尝试会报编译错误

    公共类测试{

    public Test() {
    }
    
    public static void main(String[] args) {
        new Test().execute(); // test method
    }
    
    public void execute() {
        InnerClass innerClassInstance = new InnerClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerClassInstance.a);
    
        InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerStaticClassInstance.a);
    }
    

    }

    类内部类 { 私人int a; // 只能在 InnerClass 中访问?? }

    最终类 InnerStaticClass { 私人int a; // 只能在 InnerClass 中访问?? }

    【讨论】:

      【解决方案4】:

      Java language specification

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

      【讨论】:

      • 是的,我刚才看到了一个奇怪的东西。我用私有构造函数创建了一个内部类,我可以在父类中实例化这个内部类的对象而不会出错。太好了。
      猜你喜欢
      • 2016-04-08
      • 2013-05-25
      • 2019-12-28
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2013-04-11
      • 2014-07-23
      相关资源
      最近更新 更多