Java 为什么这个.hashCode()和super.hashCode()在子类中返回相同的值?

Java 为什么这个.hashCode()和super.hashCode()在子类中返回相同的值?,java,Java,我在这里有点困惑,因为我在第1行和第2行得到了相同的hashCode值,而第3行给出了不同的hashCode 您的两个类都不重写hashCode(),因此使用this和super调用完全相同的方法 第三行给出了不同的hashcode,因为它是在不同的对象上调用的,但是调用的方法与前两行相同。您正在从对象类调用defaulthashcode()方法,因为您已经重写了它。所以,没关系,您从子类或超类调用,它在内部调用对象的类hashCode()方法 第三个不同的原因是,它是一个新对象并且它有不同的虚

我在这里有点困惑,因为我在第1行和第2行得到了相同的hashCode值,而第3行给出了不同的hashCode

您的两个类都不重写
hashCode()
,因此使用
this
super
调用完全相同的方法


第三行给出了不同的hashcode,因为它是在不同的对象上调用的,但是调用的方法与前两行相同。

您正在从对象类调用default
hashcode()
方法,因为您已经重写了它。所以,没关系,您从子类或超类调用,它在内部调用对象的类
hashCode()
方法

第三个不同的原因是,它是一个新对象并且它有不同的虚拟内存地址,对象类
hashCode()
方法返回它

指的是当前类对象,
super
指的是直接父类对象,因此两者都不同

没有单独的“父对象”。它是类B的一个对象。因为类B扩展了类A,所以B的任何实例也是A的有效实例,但它仍然只是一个对象

例如:

class A {

}

class B extends A {

    void m1(){       
        System.out.println(this.hashCode());    // Line 1
        System.out.println(super.hashCode());   // Line 2 
        System.out.println(new A().hashCode()); // Line 3    
    } 
}

class Test {

    public static void main(String[] args) {
        B bobj=new B();
        bobj.m1();
    }
}
输出:
相同对象
,显示A的方法和B的方法看到的
对象是相同的

因此,哈希代码也是一样的


使用
super
仅区分重写方法时调用的方法实现。它不提供对不同对象的访问。

听起来您可能认为哈希代码值基于调用它的类,但实际上并非如此;它基于它被调用的对象。我知道哈希代码值基于它被调用的对象。这指的是当前类对象,而super指的是直接的父类对象,所以两者是不同的。那么为什么第1行和第2行返回相同的值呢?没有单独的“父对象”。它是类B(扩展类A)的一个对象,但它仍然是一个对象。无论何时创建子类的实例,父类的实例都会隐式创建,即由超级引用变量引用。如果我错了,请纠正我
父类的实例是隐式创建的
——此语句为false。没有超类的实例。此关键字引用当前类对象,而super关键字引用直接父类对象,因此两者都不同。那么为什么第1行和第2行返回相同的值?什么是“类对象”?Java中没有这样的东西,我说的是直接父类的对象,或者super-classsuper关键字用于访问当前对象上的直接超类成员。它不引用任何超级类对象。此语句正确吗?感谢Marko,让我对超级关键字的理解正确。此关键字引用当前类对象,超级关键字引用直接父类对象,因此两者都不同。那么为什么第1行和第2行返回相同的值呢?@user3283293:您必须重写abu或auper类中的
hashCode()
方法,因此,它将被委托给对象类
hashCode()
方法。
class A {
    Object getA() { return this; }
}

class B extends A {
    Object getB() { return this; }
}

class Test {
    public static void main(String[] args) {
        B obj = new B();
        if (obj.getA() == obj.getB()) {
            System.out.println("Same object");
        } else {
            System.out.println("Different objects");
        }
    }
}