覆盖等于(对象o)

时间:2011-06-22 18:38:46

标签: java

假设我有一个班级

class Key {

    public boolean equals(Object o) {
        Key k = (Key)o;
        return i == k.i;
    }

    private int i;

}

我想知道为什么在equals方法中我因为它是私有的而没有得到关于访问k.i的错误?

3 个答案:

答案 0 :(得分:14)

您正在访问同一班级的成员。成员可见性规则适用于类,而不适用于类的对象。

为了进一步扩展,Java编译器(在编译时)和Java虚拟机(在运行时)通过首先查看它的类型来应用对象的可见性规则。

当必须为字段访问,方法调用和类似表达式生成字节代码时,编译器会执行此活动。访问规则基于对象的限定类型而不是单独的对象来应用。编译器的行为由Java语言规范定义。

Java虚拟机在链接过程中使用语言规范定义的相同规则执行此活动,并由虚拟机规范明确定义。

答案 1 :(得分:3)

你不应该这样做。私有成员的通常定义是它可以被同一个类的任何其他实例访问。

答案 2 :(得分:2)

“私有”成员可以在同一个文件中访问(相同的类,嵌套的静态和非静态类)。

(当然,嵌套的静态类需要对封闭类进行显式引用才能访问私有成员。)