2012-07-27 83 views
-3
class Test4{ 
    int a=2; 
    public static void main(String[] args){ 
    Test4 test4=new Test4(); 
    Test4 test5=new Test5(); 
    System.out.println("test4_a="+test4.a); 
    System.out.println("test5_a="+test5.a); 
    System.out.println(test4.a==test5.a); 
    } 
} 
class Test5 extends Test4{ 
    float a=2.0f; 
} 

這兩個屬性的類型是不一樣的。爲什麼「test4.a == test5.a」仍然是真的? 請詳細說明子類的屬性。謝謝!子類的哪個類型的屬性不能被繼承?

+3

因爲'2.0'和'2'是相同的數字,'=='運算符比較它的兩個操作數的值。 – 2012-07-27 12:46:41

+0

一個是int,另一個是float.How它們可以是相同的數字嗎? – Europa 2012-07-27 12:48:03

+0

'float'和'int'是它們的類型,而不是它們的值。兩個變量只需要具有相同的值來滿足'=='。 – 2012-07-27 12:49:00

回答

2

這是我認爲令你困惑。看到這個例子:

public static void main(String[] args) 
{ 
    int a = 5; 
    double b = 5.0; 
    short c = 5; 

    System.out.println(a == b); 
    System.out.println(b == c); 

    int[] x = {1,2,3}; 
    int[] y = {1,2,3}; 

    System.out.println(x == y); 

} 

這樣做的結果是

真正

真正

爲什麼? 基本類型,也被稱爲primitive types,按價值進行比較。正如我上面所說的,2千美元和2千美元的報價是相同的報價。它們代表相同的價值。

但是,對象,如數組,應該通過它們的equals()方法進行比較。使用默認的等號運算符==只是比較內存位置。因此,兩個分開的數組,兩個都有相同的對象,但內存中的對象不同,並不相同。在另一方面,如果我說

int[] y = x; 

然後x == y將是真實的,因爲他們會在內存中指向同一個對象。

注:我意識到數組可能不是最好的例子,因爲比較數組應該使用靜態的Arrays.equals(int[], int[])方法進行真正的深度搜索。 x.equals(y)仍然是假的,但Arrays.equals(x,y)會給你真正的

+0

哦,非常感謝。這是我的錯。我誤導了你另一個問題。現在我在Test5.I中更改我的代碼。我改變了「float a = 2.0f;」到「String a =」abc「。爲什麼」test4.a == test5.a「仍然是真的?我想知道的是子類和超類之間的屬性。 – Europa 2012-07-27 13:03:59

+0

我沒有仔細閱讀這個問題,因爲我應該。閱讀@Flavio的回答 – 2012-07-27 13:05:53

1

TEST5是TEST5的一個實例(它確實是,即使它declarated爲TEST4),其中有一個浮動成員變量,隱藏父類的一個 int成員變量。

test4是Test4的一個實例,因此它有一個int成員變量。 test4.a == test5.a,因爲它們的值是相同的。

4

這個練習的訣竅是test5被聲明爲Test4類型,雖然實例化爲Test5。 當您訪問test5.a時,實際上您的值爲Test4.a。沒有浮點數到整數比較。您可以通過將浮點數定義爲5.0f來輕鬆檢查:無論如何,比較結果將爲true,因爲您正在比較變量與自身。順便說一下,這叫hiding。這很混亂,你應該知道它的存在只是爲了避免它。

+1

+1很好,我沒有仔細閱讀代碼 – 2012-07-27 13:06:25

+0

謝謝!我已經看到了「隱藏」的頁面,它可以幫助我很多。也許我可以這樣說。如果超類具有屬性,如「int a = 2;」的a,則超類將子類中的「a」隱藏起來,而不管子類中的哪個類型爲「a」。 – Europa 2012-07-27 13:31:12