2017-10-06 114 views
-1
class A {} 
class B extends A{} 

A objectX = new B(); 

最後一行是什麼意思?它是A類的對象還是B類的對象?我對多態性和對象的類型感到困惑

實例和對象是否有相同的含義?是A的objectX實例還是B的一個實例?

當我們運行objectX.SomeMethod。編譯器會檢查什麼?或者方法會在運行時檢查?

class A{} 
    class B extends A{} 
    public class Main{ 
    public static void main(String[] args){ 
    A objectX = new B(); 
    System.out.println(objectX instanceof B);//line 1 
    System.out.println(objectX instanceof A);//line 2 
    } 
    } 

如果我運行上面的代碼爲什麼它給了我真正的線1和線2.objectX指向B.How來_對象是A的一個實例?

+2

它是類型A的引用,引用了類型B的對象。這意味着您只能調用方法並引用A類中定義的字段。 –

+3

如果你在代碼中顯示你的問題,而不是試圖用文字描述它會容易得多。 –

+0

訪問: https://stackoverflow.com/questions/13077009/java-difference-between-ax-new-a-and-ax-new-b-when-b-extends-a –

回答

1

檢查這個例子:

Object aStringObject=new String(); 

在方案中的對象(超類的所有對象),B是一個字符串。因此,現在您的問題aStringObject是一個類String的對象的引用(或指針)。它被定義爲一個Object類型的引用,所以它可以指向不同類型的對象,而不僅僅是字符串。所以,如果你想避免你的代碼中的編譯錯誤,你可以只用它作爲一個對象。

如果你知道它是一個字符串雖然(你指向的實例是String類型的),你可以把它轉換爲一個字符串,它會沒事的。在上面的例子中,你可以這樣做:

String aStringString = (String) aStringObject; 

但如果對象是不是你剛纔宣佈你不能確定你能做到這一點,並通過其聲明也可以是一個字符串,但它也不能一。

你的情況:

A objectX = new B(); 

_對象是B型,但引用(指針)的實例聲明瞭A型,所以你可以作爲一種安全地使用它(無鑄造)的目的和它將起作用,因爲B類型的所有對象也都是A :)而且你可以這樣做((B)objectX).bMethod(),因爲你知道它實際上是B但它不安全,因爲它可以是一個像這樣聲明的A。

+0

反正你永遠不需要將objectX投射到「A」 - 這不是說你可以安全地使用它作爲A,它是一個A – pecks

+0

是的,這就是我的意思。你將它聲明爲A,因爲B是A,所以它是A.但是如果你想將它用作B,則需要將其轉換爲A.你不能安全地做到這一點,因爲定義並不能保證這個objectX是一個B(你可能知道它是因爲你創建了實例)。我寫了(沒有鑄造)只是爲了澄清,但我想它並沒有讓它更清楚:)我弄糊塗瞭解釋 –

+0

你當然可以用instanceof檢查它是否是B – pecks

0
A objectX = new B(); 

這裏objectX是類A(父類)的引用,它可以保存A類或B類(子類)的對象。

和右側即= new B(),是B類(子類)的對象。

永遠記得在java對象中是用new關鍵字創建的。所以左側部分是參考,右側部分是對象。

當調用這樣

objectX.someMethod() 
在這種情況下

方法中,首先檢查編譯方法是在參考類(A類)存在或不not.if本然後顯示錯誤。

如果找到方法,則方法將從子類(B類)調用,因爲方法綁定是在運行時完成的。