我有以下四个类。为什么这种类型的子类变量调用函数?
类注:
public class Note {
Pitch primaryPitch = new Pitch();
static Pitch secondaryPitch = new Pitch();
Note() {
System.out.println("Tune()");
}
static void pitch() {
System.out.println("Note.pitch()");
}
void volume() {
System.out.println("Note.volume()");
}
}
类调:
public class Tune extends Note{
Tune() {
System.out.println("Tune()");
}
static void pitch() {
System.out.println("Tune.pitch()");
}
void volume() {
System.out.println("Tune.volume()");
}
void rhythm()
{
Note note = (Note) this;
note.volume();
}
}
类歌曲:
public class Song extends Tune{
void volume() {
System.out.println("Song.volume()");
}
}
类检验:
public class Test {
public static void main(String[] args) {
Note note2 = new Song();
((Tune)note2).rhythm();
}
当我运行main时,我期望输出Note.volume()
。我期望输出的原因是因为在Tune类中,当我调用note.volume();
时,note已经被注释为Note对象,所以我期望使用Note类的volume()方法调用。相反,我得到Song.volume()
这意味着我正在使用Song类的volume()方法调用。
我的问题是,为什么我得到Song.volume()
而不是note.volume();
?
如果您还没有准备好,你应该了解的多态性,因为它解释那种行为。 – 4castle
由于'Song'覆盖了'volume',这就是覆盖的工作原理 - 它们通过多态方式调用实现的对象的实际运行时类型,而不是指针表达式的编译时类型。 –