我對強類型的理解是,該語言不會進行隱式類型轉換。但是,此代碼將char轉換爲ascii值,然後使用該值。如果Java是強類型的,那麼爲什麼這個代碼會被編譯?
static char x = 'j';
static int y = 7;
public static void main(String[] args){
System.out.println(y+x);
}
我對強類型的理解是,該語言不會進行隱式類型轉換。但是,此代碼將char轉換爲ascii值,然後使用該值。如果Java是強類型的,那麼爲什麼這個代碼會被編譯?
static char x = 'j';
static int y = 7;
public static void main(String[] args){
System.out.println(y+x);
}
Java是一種強類型的編程語言,因爲每一個變量都必須用數據類型來聲明。一個變量在不知道它可以容納的值的範圍的情況下不能開始生命,並且一旦聲明它,變量的數據類型不能改變。
實例:
下面的聲明是允許的,因爲變量有「hasDataType」被聲明爲是一個布爾數據類型:
boolean hasDataType;
對於它的餘生,hasDataType只能永遠有真或假的價值。
爲什麼字符在你的例子中被轉換爲數字。
System.out.println(y+x);
你可以看看這個example
這不是一個類型轉換。
如果您查看PrintStream的javadoc,您會注意到有幾個版本的函數println()
。
發生了什麼事情是java將您的呼叫與println(int x)
版本相匹配,因此添加了數字。
這與強或弱的打字無關。您的代碼是兩個強類型變量(char
和int
)之間隱式強制轉換的示例。
您的System.out.println(y+x)
實際編譯爲System.out.println(y+(int)x);
因此System.out.println(int arg0)
被調用。
演員(int)x
只是因爲Java將字符存儲爲UTF-16值而將字符轉換爲ascii值。
如果你的Java是強類型的,那麼爲什麼這段代碼編譯?
因爲JLS這麼說。在這種情況下,我們是widening a primitive,char可以變成int。然後我們可以添加兩個整數並輸出結果。如果你願意的話,你可以把narrow int整理回char。
System.out.println((char) (y+x));
「強類型」對不同的人意味着不同的事情,但Java中有很多隱式轉換。鑑於這個問題依賴於「強類型」的含義,我已經投票決定將它作爲一個基於意見的問題來結束它。 –
char只是一個無符號的16位數字。沒什麼特別的。 – WalterM