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();
}
}
我在这里有点困惑,因为我在第1行和第2行获得相同的hashCode值,而第3行给出了不同的hashCode。
答案 0 :(得分:5)
您的任何一个类都不会覆盖hashCode()
,因此使用this
和super
同时调用完全相同的方法。
第三行给出了一个不同的哈希码,因为它是在另一个对象上调用的,但是被调用的方法再次与前两行相同。
答案 1 :(得分:1)
您正在调用Object类中的默认hashCode()
方法,因为您已覆盖它。所以,无所谓,你从子类或超类调用,它在内部调用Object的类hashCode()
方法。
第三个不同的原因,它是一个被调用的新对象。 它具有不同的虚拟内存地址,而Object类hashCode()
方法返回。
答案 2 :(得分:0)
this
引用当前的类对象,super
引用直接父类对象,因此两者都不同。
没有单独的“父对象”。它是B类的一个对象。因为B类扩展了A类,所以B的任何实例也是A的有效实例,但它仍然只是一个对象。
示例:
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");
}
}
}
输出:Same object
,显示A方法看到的this
对象和B方法看到的对象相同。
因此,hashCode也一样。
super
的使用仅区分在重写方法时调用哪个方法实现。它不允许访问不同的对象。