2014-02-07 53 views
0
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。爲什麼this.hashCode()和super.hashCode()在子類中返回相同的值?

+0

這聽起來像你可能認爲哈希碼值是基於它所調用的類,但它不是;它基於它被調用的對象。 – Boann

+0

我知道哈希碼值是基於它被調用的對象。這指的是當前的類對象,super指的是直接的父類對象,因此兩者都不相同。那麼爲什麼第1行和第2行返回相同的值? – anirudh

+0

沒有單獨的「父對象」。它是B類的一個對象(它擴展了A類),但它仍然是一個對象。 – Boann

回答

5

您的兩個類都不會覆蓋hashCode(),因此完全相同的方法同時被稱爲thissuper

第三行給出了一個不同的哈希碼,因爲它是在不同的對象上調用的,但調用的方法與前兩行相同。

+0

此關鍵字引用當前類對象,super關鍵字引用直接父類對象,因此兩者都不相同。那麼爲什麼第1行和第2行返回相同的值? – anirudh

+0

什麼是「類對象」? Java中沒有這樣的東西。 –

+0

我正在談論直接父級或超類的對象 – anirudh

1

您正在調用Object類的默認hashCode()方法,因爲您已覆蓋它。因此,無論你從子類還是超類調用,它都會在內部調用Object的類hashCode()方法。

第三個原因不同,它是一個新的對象。 它有不同的虛擬內存地址,而對象類hashCode()方法返回它

+0

此關鍵字引用當前類對象,super關鍵字引用直接父類對象,因此兩者都不相同。那麼爲什麼第1行和第2行返回相同的值? – anirudh

+0

@ user3283293:您havint覆蓋abu或auper類中的'hashCode()'方法,因此,它將被委派給Object類'hashCode()'方法。 –

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的方法如看到和B的方法所看到的this對象是相同的。

因此,hashCode也一樣。

super的使用僅區分如果方法被覆蓋時調用哪個方法實現。它不允許訪問不同的對象。

相關問題