【发布时间】:2018-05-01 21:34:20
【问题描述】:
我一直在研究 Java 中的继承,作者声明“它是被引用的对象的类型(而不是引用变量的类型),它决定了将执行哪个版本的覆盖方法。” 这句话非常令人困惑。
【问题讨论】:
标签: java oop inheritance polymorphism
我一直在研究 Java 中的继承,作者声明“它是被引用的对象的类型(而不是引用变量的类型),它决定了将执行哪个版本的覆盖方法。” 这句话非常令人困惑。
【问题讨论】:
标签: java oop inheritance polymorphism
参考变量是表示/解释变量的术语 仅指一种类型,尚未实例化。 同样在实例化之后,它的类型将取决于引用变量将被实例化的方式或类。
从上面罗伯特·哥伦比亚的例子中说
Person myBFF;
或者以布伦为例
Coordinate cords; //Cords is the ref. var
在这两种情况下,myBFF 和cords 仅分别引用 Person 或 Coordinate 类。请注意,它们尚未实例化!
【讨论】:
引用变量如下所示:
Coordinate cords; //Cords is the ref. var
that 内部的引用变量是您计算机 RAM 中的一个地址,用于存储该对象的属性。由于我们没有实例化(实际上是创建一个对象)上述cords对象的地址是null
引用变量保存内存保留部分的地址。
cords = new Coordinate(0.0,0.0,0.0);
现在计算机的 RAM 内部是一个保留空间,用于保存三个浮点类型变量。在实例化时,引用变量保存地址。那么我们可以用 Java 中的地址做什么呢?
没什么用。 Java内存地址没用,看不到(虽然看起来像0xFFFFFFF)
对于视觉表示点击here
【讨论】:
这本书所指的是多态,更具体地说是通过动态调度。
简而言之,想象以下类:
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();
打印出来:
大家好!
在每种情况下,您使用的引用变量都是 Person 类型。在每种情况下,变量的 instance 分别是 NewYorker 和 Texan。 那个实例类型决定了调用introduceYourself()的哪个版本。
【讨论】:
Texan bob = new SouthernTexan(); 或SouthernTexan sue = new SouthernTexan();,但您可以不 使用NewYorker clyde = new SouthernTexan();,也不能使用SouthernTexan henry = new Person();。
引用变量是您在左侧指定的类型(包含引用类型的变量)。作者所指的是右手边不同的时候。考虑
Object a = new Foo();
System.out.println(a.toString());
如果Foo 覆盖Object.toString()(即如果Foo 提供了public String toString())方法那么 调用的是Foo 的toString(不是Object 的)。另请参阅 Java 教程中的 Overriding and Hiding Methods。
【讨论】: