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

时间:2014-02-07 10:23:16

标签: java

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。

3 个答案:

答案 0 :(得分:5)

您的任何一个类都不会覆盖hashCode(),因此使用thissuper同时调用完全相同的方法。

第三行给出了一个不同的哈希码,因为它是在另一个对象上调用的,但是被调用的方法再次与前两行相同。

答案 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的使用仅区分在重写方法时调用哪个方法实现。它不允许访问不同的对象。