2015-11-27 12 views
2

我對強類型的理解是,該語言不會進行隱式類型轉換。但是,此代碼將char轉換爲ascii值,然後使用該值。如果Java是強類型的,那麼爲什麼這個代碼會被編譯?

static char x = 'j'; 
static int y = 7; 

public static void main(String[] args){ 
    System.out.println(y+x); 
} 
+9

「強類型」對不同的人意味着不同的事情,但Java中有很多隱式轉換。鑑於這個問題依賴於「強類型」的含義,我已經投票決定將它作爲一個基於意見的問題來結束它。 –

+1

char只是一個無符號的16位數字。沒什麼特別的。 – WalterM

回答

4

Java是一種強類型的編程語言,因爲每一個變量都必須用數據類型來聲明。一個變量在不知道它可以容納的值的範圍的情況下不能開始生命,並且一旦聲明它,變量的數據類型不能改變。

實例:

下面的聲明是允許的,因爲變量有「hasDataType」被聲明爲是一個布爾數據類型:

boolean hasDataType; 

對於它的餘生,hasDataType只能永遠有真或假的價值。

爲什麼字符在你的例子中被轉換爲數字。

System.out.println(y+x); 

你可以看看這個example

0

這不是一個類型轉換。

如果您查看PrintStream的javadoc,您會注意到有幾個版本的函數println()

發生了什麼事情是java將您的呼叫與println(int x)版本相匹配,因此添加了數字。

1

這與強或弱的打字無關。您的代碼是兩個強類型變量(charint)之間隱式強制轉換的示例。

您的System.out.println(y+x)實際編譯爲System.out.println(y+(int)x);因此System.out.println(int arg0)被調用。

演員(int)x只是因爲Java將字符存儲爲UTF-16值而將字符轉換爲ascii值。

0

如果你的Java是強類型的,那麼爲什麼這段代碼編譯?

因爲JLS這麼說。在這種情況下,我們是widening a primitive,char可以變成int。然後我們可以添加兩個整數並輸出結果。如果你願意的話,你可以把narrow int整理回char。

System.out.println((char) (y+x));