我有以下四個類。爲什麼這種類型的子類變量調用函數?
類注:
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',這就是覆蓋的工作原理 - 它們通過多態方式調用實現的對象的實際運行時類型,而不是指針表達式的編譯時類型。 –