子类中的私有字段可以在超类中访问

时间:2015-08-28 14:47:19

标签: java jls

它是用JLS编写的(参见第8.3节):

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

你能举一个这个陈述的例子吗?

我知道我们可以写:

public class MyClass {
    private int x = 1;

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

这里我们访问私有字段m.x但我们这里没有“超类” - “子类”。

2 个答案:

答案 0 :(得分: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节)的主体内时才允许访问

此处x的使用位于Test的正文中,这是包含x声明的顶级类...尽管如果您尝试使用{{1}不合格,或只是x,失败......正是因为this.x实际上并未继承(根据您引用的规范)。

答案 1 :(得分:0)

方法"可见性" - 顾名思义 - 是关于方法和变量在哪里"可见"给程序员。作为一般契约,在类定义中的变量总是在类定义中可见,即使它们被声明为私有并且被该类的实例化对象(而不是#34;这个")引用。

关于可见性和封装的规则,在设计方面,旨在帮助确保程序员不会意外地访问如果意外使用会破坏功能的变量和方法。例如,如果您要手动调用

,则可以打破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源代码)

但是,在您编写的代码范围内,通常认为在定义为该类的类型的对象上调用私有变量/方法是正确的,因为它被假定为代码的程序员和编写者在问题上,您拥有正确管理代码所需的权限,代理和专业知识。

因此,一般而言,无论变量是否声明为私有,都可以使用以下代码:

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

永远有效。