2012-01-19 48 views
5

這是一個簡單的代碼空引用是類的一個實例嗎?

class Foo { 
} 

class Bar extends Foo { 
} 

public class Main { 

public static void main(String[] args) throws Exception { 
    fn(null); 
} 

static void fn(Foo f) { 
    System.out.println(f instanceof Foo ? "Foo" : "Bar"); 
} 
} 

我的問題是:java中如何知道傳遞null是Bar而不是Foo? 我知道爲什麼編譯器選擇Bar而不是Foo(因爲有從foo到bar的轉換,從bar到foo的轉換,反之亦然)。 但是,該方法如何知道這個null來自Bar而不是Foo? does null是否包含有關分配給該對象的某些信息?

+0

Null不能是Bar或Foo。它是空的。 –

回答

23

你在錯誤地閱讀它。 instanceof總是評估爲false對於null參考。

Java specification(重點煤礦):

在運行時,如果RelationalExpression的值不爲空和參考可投instanceof運算符的結果爲真(§15.16 )添加到ReferenceType而不引發ClassCastException。否則結果是錯誤的。

+0

也許更多,因爲'null'不是實例。然而,null可以分配給每個類。 –

+0

+1完美答案。 – apines

1

它總是假的。 Javac知道它。

但是你可以使用f.someStaticFunctionOfTheClassFoo()。所以,你的問題非常有趣,只有它需要被編輯。

+1

我不明白在這裏如何提到靜態方法很有用。 –

1

是一個空引用的類的實例?

讓我們清楚這一點。參考不是任何事物的實例。這是一個參考。 對象指的是,如果有的話,是某個類的實例。但空引用並不涉及任何對象。

我的問題是:Java如何知道傳遞的null是Bar而不是Foo?

它沒有。你的程序欺騙了你。如果參考文獻不是涉及Foo的實例,則它打印「條」。糟糕的編碼。

我知道編譯器選擇Bar而不是Foo的原因(因爲從foo到bar和從bar到foo的轉換,而不是反之亦然)。

編譯器沒有任何這樣的選擇。你的代碼做了一個設計不好的測試和打印。

但是,如何知道這個null來自Bar而不是Foo?

它沒有。它猜到了。它錯了。

does null是否包含有關指定對象的某些信息?

它根本沒有信息。

+0

事實證明,當我問這個問題時,我是一個白癡:) –

+1

@SleimanJneidi我不會那麼粗魯以至於認同,但能夠承認自己的錯誤總是很好的。 – EJP

0

null是一種特殊類型,特殊類型是「NullType」。

相關問題