You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Java多态实现问题:testInstrument.java中调用play()报错求助

解决调用all[i].play()时的错误:实现乐器演奏输出功能

嘿,我懂你现在的困扰——想通过testInstrument.java实现所有乐器演奏的输出,结果调用System.out.println(all[i].play())的时候掉坑里了对吧?咱们结合你提到的三个文件,一步步排查可能的问题:

最常见的坑:父类Instrument没定义play()方法

如果你的Instrument类是个“空架子”,没声明play()方法,那哪怕子类Piano实现了这个方法,用父类类型的数组引用也没法调用它。这是多态的基础要求哦。

给你个正确的Instrument类示例:

// Instrument.java
// 可以做成抽象类,强制子类实现play方法
public abstract class Instrument {
    // 定义抽象的play方法,子类必须重写
    public abstract String play();
}
// 或者如果不需要抽象,写个基础实现也可以:
// public class Instrument {
//     public String play() {
//         return "默认乐器演奏声";
//     }
// }

子类Piano重写play()方法要规范

子类的play()方法必须和父类的方法签名完全匹配(返回值、方法名、参数一个都不能错),建议加上@Override注解,编译器会帮你检查有没有写错:

// Piano.java
public class Piano extends Instrument {
    @Override // 这个注解很重要,能避免你写错方法签名
    public String play() {
        return "钢琴:叮咚叮咚,清脆悦耳";
    }
}

要是父类的play()void类型(比如方法里直接打印内容),那你绝对不能把它放进System.out.println()里——因为void方法没有返回值,这时候直接调用all[i].play();就好。

testInstrument.java的数组初始化和调用要正确

你得确保数组里的元素是正确实例化的子类对象,同时匹配play()方法的返回值:

// testInstrument.java
public class testInstrument {
    public static void main(String[] args) {
        // 初始化乐器数组,这里可以加更多乐器子类
        Instrument[] all = {new Piano()};
        
        for (int i = 0; i < all.length; i++) {
            // 如果play()返回String,这样打印没问题
            System.out.println(all[i].play());
            // 要是play()是void类型,改成下面这样:
            // all[i].play();
        }
    }
}

别忽略访问权限问题

一定要保证Instrument类的play()方法是public或者protected的,要是设成private,子类没法重写,外部类也调用不了,肯定会报错。

把这些点挨个排查一遍,应该就能顺利输出所有乐器的演奏内容啦!

内容的提问来源于stack exchange,提问作者Sean Courtney

火山引擎 最新活动