2012-08-08 22 views
1

我的代碼是如何實例化在此Java代碼片斷髮生

class Alpha 
{ 
public void foo() 
    { 
    System.out.print("Alpha "); 
    } 
} 

class Beta extends Alpha 
{ 
public void foo() 
    { 
    System.out.print("Beta "); 
    } 

public static void main(String[]args) 
    { 
    Alpha a = new Beta(); 
    Beta b = (Beta)a; 

    a.foo(); 
    b.foo(); 
    } 
} 

輸出: -

Beta Beta 

我新的Java和這種實例的我所遇到的第一個時間,這就是爲什麼我不能夠理解爲什麼輸出不

Alpha Beta 

如果「一」是阿爾法類的對象,然後爲什麼不調用Alpha的方法?

請幫我一把。

回答

1

創建的對象是Beta類型,因爲這是由new創建的。所以,當調用foo()時,無論您在代碼中「調用」什麼,它都可以在Beta對象上工作。

+0

但是'b'實例化的行是什麼意思? – 2012-08-08 18:49:08

+0

將這些看作是對內存中對象的引用。你實際上只創建了一個真實的對象,這發生在'new'上。當你給出'Beta b =(Beta)a'時,你得到的是一個新的'Beta'變量,指向與'a'相同的東西。所有對象變量實際上只是引用,所以如果你想要兩個不同的對象,那麼你需要明確地做到這一點。 – Carl 2012-08-08 18:53:09

+0

所以在這種情況下'b'在'a'已經存在時實際上是沒有用的......我是對的嗎? – 2012-08-08 18:58:06

1

將對象作爲超類進行投射或引用不會取消覆蓋方法。即使您最初將其引用爲Alpha對象,foo()方法仍在Beta對象上調用。

+0

但是那個'b'實例化的行是什麼意思? – 2012-08-08 18:44:53

+0

@HimanshuAggarwal'b'沒有實例化,您正在將'a'(一個Beta對象被引用爲Alpha對象)轉換爲Beta對象,以便它被引用爲Beta對象。 – 2012-08-08 18:49:32

0

當父類變量引用子類對象時,引用將調用子方法。

0

您只有一個Beta類型的對象。投射對象不會使java使用父方法。

0

在java中,默認情況下方法是虛擬的。在決定實際調用哪種方法時,底層對象的類型很重要,而不是對該對象的引用的類型。