2017-06-17 38 views
-2

雖然有這麼多的問題涉及到這個主題,但總覺得我不知道或說我不滿意這些答案,所以我在這裏發佈再次變量的靜態,動態,弱,強類型

Integer in=new Integer(4); 
    Character character=(Character) in; //Cannot cast from Integer to Character 
    String s="hello"; 
    int j=(int) s;//Cannot Cast from string to int 
    char chi='a'; 
    int l=(int)chi; //works 
    int i=0; 
    char ch=(char)i; //works 
    String b=(String)1+"hello";//cannot cast from int to string 
在第二

,第4和第9行它讓我看到評論錯誤,而我可以在它被註釋掉工程線路使INT焦炭之間的轉換。

所以在我發佈的代碼中,編譯器檢查靜態/動態行爲以及檢查弱/強行爲的位置。

我相信這些問題肯定會有這麼多答案可用,所以如果可以的話發佈鏈接,否則詳細的解釋將非常可觀。

是什麼讓我困惑

  • 一些如何靜態/動態和強/弱的外表一樣給我
  • 如何編譯器知道何時檢查靜態/動態類型和時檢查強/弱類型
  • 這兩種類型檢查系統的必要性是什麼。
+1

'char'和'int'都是數字原語,這就是爲什麼這是可行的,因爲'char'在內部被表示爲一個無符號的8位數字,就像將一個long賦給一個double類型 – Moira

+5

實際上並不存在兩種類型檢查 - 只是一些固定的數值轉換,可能適用於某些情況。關於「編譯器如何知道」 - 呃,它知道,因爲語言規範包含非常明確的規則:[第5章轉換和上下文](https://docs.oracle.com/javase/specs/jls/ se8/html/jls-5.html) – Hulk

+0

不能將對象轉換爲原始類型。 – Blasanka

回答

4

您完全忽略了Static vs Dynamic的概念,我不知道在問題中Strong vs Weak是什麼意思,因爲您的問題似乎是關於Primitives vs Objects。

Static vs Dynamic約爲方法綁定,即確定當對象被子類化時要調用哪個對象的方法。你的代碼沒有調用任何方法,所以Static vs Dynamic對你的問題沒有意義。

正如我所說,我不知道你的意思是強vs弱。 Java有強引用和弱引用的概念,但這都是關於垃圾回收的,這與你的問題無關。

你的問題似乎是基元左右,這是所有小寫的類型:
byteshortcharintlongfloatdoubleboolean
忽略boolean,其是true VS false值,這些都是數字類型,即它們存儲一個數字值,並且它們不是對象

數字原始值可以相互賦值,但如果賦值可能導致值的大小損失(稱爲narrowing primitive conversion),則轉換是必需的。

對象是混合情況下的類型,例如, IntegerCharacterString等(用戶對象類型可以是小寫字母,但這違反了命名標準)。

如果對象類型通過子類相關,則可以將對象類型相互分配,但在向下轉換時需要強制轉換(稱爲narrowing reference conversion)。

除了涉及auto-boxing和/或auto-unboxing時,對象和原語不能互相投射,例如, int往返Integer

在問題結尾處的3個問題中,只有第三個問題有意義,如果它被重新設置爲「爲什麼Java具有原始類型?」。已經在這裏回答:Why do people still use primitive types in Java?,和這裏:Why are there Primitive datatype in Java?