2014-10-29 34 views
1

jls-4.1它說,的Java種類型和空引用

有兩種類型的Java編程語言:基本類型(4.2節)和引用類型(第4.3節)

還有一個特殊的NULL類型

因此,基本上null類型既不是原始也不是引用類型。

但是,如果它不被視爲引用類型,爲什麼它可以保存引用和can always undergo a widening reference conversion to any reference type

或者它到底是什麼樣的參考類型?它可以被視爲參考類型嗎?

那麼,問題的答案是什麼 - Is [null] a reference type or not - 應該是什麼? YesNo

+0

「在實踐中,程序員可以忽略null類型,只是假裝空只是一個特殊的文本,可以是任何引用類型「。 – 2014-10-29 13:54:21

回答

5

首先,null不是一個類型,而是。類型爲引用類型的變量可能有爲空,但不能在需要引用類型的位置使用null,您無法聲明類型爲null的變量,並且不能使用類型參數null,例如你不能申報List<null>

null有一個特殊的「空類型」,它只在編譯(和驗證)過程中才能夠形成「空類型」可分配給引用類型的形式規則。但是 「空類型」不是引用類型。

要從規範添加一些引號:

JLS §4.1

還有一個特殊的空值類型,表達空的類型(§3.10.7,§15.8.1),沒有名字。

...

空引用總是可以被分配或澆鑄任何引用類型(第5.2節,第5.3節,§5.5)。

實際上,程序員可以忽略null類型,只是假裝null僅僅是一個特殊的文字,可以是任何引用類型。


JVMS §4.10.1.2

Verification type hierarchy: 

          top 
       ____________/\____________ 
       /      \ 
      /       \ 
      oneWord      twoWord 
     / | \     /  \ 
     / | \     /  \ 
     int float reference  long  double 
        / \ 
        /  \_____________ 
       /     \ 
       /      \ 
      uninitialized     +------------------+ 
      /  \      | Java reference | 
     /   \     | type hierarchy | 
uninitializedThis uninitialized(Offset) +------------------+ 
                | 
                | 
                null 
+0

哇..其可惜只有一個upvote是每個答案..:) – TheLostMind 2014-10-29 14:19:01

+0

在其他語言中,「底部」類型被定義爲所有參考類型的子類型。 Java沒有選擇這種方法,也許是因爲Java的方法更簡單。 – 2014-10-29 18:56:15

5

那麼,它也表示In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.

因此它可被認爲是可以被分配給任何引用類型的值。

+0

但我不是在談論練習。所以最終不是某種參考類型? – lapots 2014-10-29 13:57:23

+0

@ user1432980 - 沒關係。正如* Marko Toplonik *在他的回答中指出的那樣。行爲是重要的,而不是*語義*。 – TheLostMind 2014-10-29 14:04:09

+1

@ user1432980 JLS表示它不是,但不管它是否是參考類型都沒有實際意義。 – Eran 2014-10-29 14:06:54

2

null類型可以被視爲一個參考的類型,因爲你可以有Object o = nullint i = null會給編譯錯誤。其實,null只是一個佔位符,說沒有什麼。在這種情況下,您的物體指向什麼也沒有

所以,如果你撥打o.toString(),你會得到一個NullPointerExeption因爲你試圖調用沒有什麼方法。

+0

@Holger - 你的代碼會給出一個NPE ..編譯器不允許我們直接給一個原始類型分配一個空值。這證明null與基本類型*不兼容。在你的例子中,你是* hoodwinking *編譯器。 – TheLostMind 2014-10-29 14:32:22

+0

但與原始類型不兼容並不證明是引用類型。順便說一句,'int i = true? 42:null;'會在沒有拋出NPE的情況下工作。我只想強調一下,是否產生編譯器錯誤,並不是真正的正式規則證明。 – Holger 2014-10-29 14:39:14

+0

@Holger - 那你爲什麼認爲原始類型不能引用'null'? – TheLostMind 2014-10-29 14:43:13

1

null通常被認爲更象是一個佔位來設置到對象的引用,以及null使對象符合垃圾收集等,它有很多更多的用途太...回來給你Qeeston null可以考慮特別引用類型太

2

您所引述的規範,明確闡明這null引用類型的部件。引用類型的值始終是引用,並指定null作爲引用類型可能需要引入許多有關JLS的特例約定。

但是,您最應該謹慎的「清除」您的整個問題,因爲它對於Java編程的任何實際方面都是無關緊要的,並且只對JLS內部定義的上下文感興趣。如果在考試中出現這種問題,您應該責怪作者提出的問題。作爲一個面試問題,它可能只能作爲一個談話起始者。