Java 重写等于(对象o)

Java 重写等于(对象o),java,Java,假设我有一节课 class Key { public boolean equals(Object o) { Key k = (Key)o; return i == k.i; } private int i; } 我想知道为什么在equals方法中,由于k.I是私有的,所以访问k.I时没有出现错误?您访问的成员来自同一个类。成员可见性规则适用于类,而不是类的对象 为了进一步扩展,Java编译器(在编译时)和Java虚拟机(在运行时)通

假设我有一节课

class Key {

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

    private int i;

}

我想知道为什么在equals方法中,由于k.I是私有的,所以访问k.I时没有出现错误?

您访问的成员来自同一个类。成员可见性规则适用于类,而不是类的对象

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

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


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

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

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


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

@OneMoreVladimir,如果这个问题对您有帮助,您应该通过单击该问题旁边的复选框来接受答案。如果要更改对象的相等性,请不要忘了覆盖
hashCode