我一直在研究Java中的继承,并且编写器声明“它是被引用的对象的类型(不是引用变量的类型),它决定了将被执行的被覆盖方法的版本。” 这句话非常令人困惑。
答案 0 :(得分:6)
本书所指的是多态,更具体地说是动态调度。
简而言之,想象下面的课程:
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 类型。在每种情况下,变量的实例分别是 NewYorker 和 Texan 。 实例类型确定调用 introductionYourself()的哪个版本。
答案 1 :(得分:3)
引用变量是您在左侧指定的类型(包含引用类型的变量)。作者所指的是当右手边不同时。考虑
Object a = new Foo();
System.out.println(a.toString());
如果Foo
覆盖Object.toString()
(即Foo
提供public String toString()
)方法那么,则为Foo
被调用的toString
(不是Object
)。另请参阅Java教程中的Overriding and Hiding Methods。
答案 2 :(得分:1)
参考变量如下所示:
Coordinate cords; //Cords is the ref. var
内部引用变量是计算机内存中存储该对象属性的地址。由于我们没有实例化(实际上是一个对象)上述绳索对象的地址是null
引用变量将地址保存到内存的保留部分。
cords = new Coordinate(0.0,0.0,0.0);
现在计算机的RAM内部是一个保留空间,它包含三个浮动类型变量。在实例化时,引用变量保存地址。那么我们可以用Java中的地址做什么呢?
没什么用。 Java内存地址没用,你看不到它们(虽然它们看起来像0xFFFFFFF)
要获得直观表示,请点击here
答案 3 :(得分:1)
参考变量是表示/解释变量的术语 仅指一种类型,尚未实例化。 同样,在实例化之后,它的类型将取决于引用变量将如何实例化或由哪个类实例化。
从罗伯特哥伦比亚的上述例子说
Person myBFF;
或者以 Brenann 为例
Coordinate cords; //Cords is the ref. var
在这两种情况下,myBFF 和 cords 仅分别引用 Person 或 Coordinate 类。请注意,它们尚未实例化!