2017-11-18 300 views

回答

4

本書指的是多態性,更具體地說是通過動態調度

簡而言之,可以想象以下類:

public class Person { 

    public Person() { 
    } 

    public void introduceYourself() { 
    } 

} 

public class Texan extends Person { 

    public Texan() { 
    } 

    public void introduceYourself() { 
     System.out.printLn("Howdy y'all!"); 
    } 

} 

public class NewYorker extends Person { 

    public NewYorker() { 
    } 

    public void introduceYourself() { 
     System.out.printLn("Yo. You got a problem with that?"); 
    } 

} 

現在,讓我們創建Person類型的引用變量。

Person myBFF; 

讓他實例

myBFF = new NewYorker(); 

讓我們叫他自己介紹

myBFF.introduceYourself(); 

此打印:

呦。你對此有看法?

現在,讓我們把你的BFF換成德克薩斯人。

myBFF = new Texan(); 

讓我們再次調用同一行,並要求我們的BFF自我介紹。

myBFF.introduceYourself(); 

此打印:

你好你們!

在每種情況下,您使用的參考變量的類型爲。變量的實例分別是NewYorker德克薩斯州實例類型決定了哪個版本的引入了自己()被調用。

+0

你有一個真正的解釋訣竅!非常感謝,但我確實有一個問題;無論多少代子類都是類型超類的總是引用變量?例如。如果我將德克薩斯州延長到SouthernTexan,該參考變量是否仍然是Person類型? – user8865657

+1

是的,但是你可以聲明一個引用變量爲更接近實例類型的類型。例如,你可以做'Texan bob = new SouthernTexan();'或'SouthernTexan sue = new SouthernTexan();',但是你不能*做'NewYorker clyde = new SouthernTexan();',你也不能'SouthernTexan henry =新人();'。 –

4

引用變量是您在左側指定的類型(保存引用類型的變量)。作者所指的是當右手邊不同時。考慮

Object a = new Foo(); 
System.out.println(a.toString()); 

如果Foo覆蓋Object.toString()(即,如果Foo提供public String toString())方法然後它是FootoString被調用(不Object的)。另請參閱Java教程中的Overriding and Hiding Methods

+1

感謝的人。我想我知道了 – user8865657

2

的參考變量是這樣的:

Coordinate cords; //Cords is the ref. var 

裏面的參考變量是存儲該對象的屬性,您的計算機的RAM內的地址。由於我們沒有實例化(實際上是一個對象)上述線對象的地址是null

引用變量將地址保存到內存的保留部分。

cords = new Coordinate(0.0,0.0,0.0); 

現在計算機的RAM內部是一個保留三個浮點型變量的保留空間。實例化時,引用變量保存地址。那麼我們可以用Java中的地址做些什麼?

沒有用處。 Java的內存地址是沒用的,你無法看到它們(雖然他們看起來像0xFFFFFFF可)

有關視覺表現單擊here

相關問題