2015-08-28 98 views
3

这是写在JLS访问(见8.3):私人领域是超

“超类的私有字段可能是访问一个子类 - 例如,如果 两个类的成员同一类。然而,私人领域永远不会由一个子类继承 。“

你可以给这个陈述的例子吗?

我知道,我们可以这样写:

public class MyClass { 
    private int x = 1; 

    public void testExample(MyClass m) { 
     m.x = 2; 
    } 
} 

下面我们进入私人领域m.x但我们没有“超班” - “子类”在这里。

+1

另请参阅https://groups.google.com/d/msg/java-lang-fans/KVmmgeSCHkA/7nAQolGcsjwJ – ZhongYu

回答

3

这是谈论嵌套类 - 这里有一个例子:

public class Test { 
    public static void main(String[] args) { 
     new Subclass(10).foo(); 
    } 

    static class Superclass { 
     private int x; 

     Superclass(int x) { 
      this.x = x; 
     } 
    } 

    static class Subclass extends Superclass { 
     Subclass(int x) { 
      super(x); 
     } 

     public void foo() { 
      Superclass y = this; 
      System.out.println(y.x); 
     } 
    } 
} 

它是有效的,因为JLS 6.6

否则,成员或构造函数声明为private,并允许访问,当且仅如果它出现在包含成员或构造函数声明的顶级类(§7.6)的主体内

这里使用的xTest的身体,这是顶层类封闭的x的声明中...但如果你尝试使用x不合格的,或只是this.x,失败......正是因为x ISN”实际上继承了(根据你引用的规范)。

+0

不是编译错误 - 成员“this.x”不存在,因为“x”不是遗传。 – ZhongYu

+0

@ bayou.io:啊哈,很好的捕捉,以及一个很好的例子*完全*在问题中引用了什么:) –

+0

谢谢乔恩,我认为你是对的。这个问题是一个更常见规则的特例:所有嵌套类都可以访问其他嵌套类的所有私有字段/方法 – Vitaly

0

方法“可见性” - 顾名思义 - 关于方法和变量对程序员“可见”的地方。作为一个通用契约,即使变量被声明为私有的,并且被该类的实例化对象(而非“this”)引用,类中定义的变量总是在类定义内可见。

有关可见性和封装的规则在设计上是为了帮助确保程序员不会意外地访问会意外破坏功能的变量和方法。例如,你打破了java.util.Random是如何工作的,如果你要手动调用

private static long seedUniquifier() { 
    // L'Ecuyer, "Tables of Linear Congruential Generators of 
    // Different Sizes and Good Lattice Structure", 1999 
    for (;;) { 
     long current = seedUniquifier.get(); 
     long next = current * 181783497276652981L; 
     if (seedUniquifier.compareAndSet(current, next)) 
      return next; 
    } 
} 

(从Sun JDK源代码源)

然而,码范围内接触你写的时候,一般认为调用被定义为该类的类型的对象上的私有变量/方法是可以的,因为假定作为相关代码的程序员和编写者,你拥有必要的权限,代理和专业知识正确管理代码。

所以一般来说,不管变量是否被声明为private或没有,下面的代码:

public class Test { 
    private float internalValue; 
    public boolean isBigger(Test t) { 
     return internalValue > t.internalValue; 
    } 
} 

始终有效。

+0

您的示例正在声明它的类的代码*中访问私有字段。我不相信这是OP所问的。 –