gpt4 book ai didi

java - 为什么这个类型转换变量要调用子类的函数?

转载 作者:行者123 更新时间:2023-12-01 17:57:09 25 4
gpt4 key购买 nike

我有以下四门类(class)。

类笔记:

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()");
}
}

类(class)曲调:

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();
}
}

类(class)歌曲:

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();

最佳答案

因为note是Song()类型的对象。将其转换为父类型的事实不会改变volume()方法的多态行为。如果您在 IDE 中运行代码并在 Tune.Rhythm() 中查看变量值,这一点就会很明显:​​

enter image description here

关于java - 为什么这个类型转换变量要调用子类的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com