覆盖equals(Object o)方法

4
假设我有一个类:
class Key {

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

    private int i;

}

我想知道为什么在equals方法中访问k.i不会出错,因为它是私有的?


4
如果您更改了对象的相等性,请不要忘记覆盖 hashCode 方法。 - Steve Kuo
3个回答

14

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

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

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

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


@OneMoreVladimir,如果这个答案对您有帮助,请点击问题旁边的勾号轮廓来接受它。 - wolfcastle

3

你不应该这样做。通常私有成员的定义是只能被同一类的其他实例访问。


2

“private”成员可以在同一文件中(同一类、嵌套静态和非静态类)中访问。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接