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