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




