2017-11-18 211 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