一个关于继承的问题(50分)

  • 主题发起人 主题发起人 蓝色虾
  • 开始时间 开始时间

蓝色虾

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
//: WindError.java

class NoteX{
//public static final int MIDDLE_C=0;
public static final NoteX MIDDLE_C=new NoteX();
public static final int C_SHARP=1,C_FLAT=2;
}

class InstrumentX{
public void play(NoteX NoteX){ //(1)
System.out.println("InstrumentX.play()");
} //(2)
}

class WindX extends InstrumentX{
public void play(NoteX n){
System.out.println("WindX.play(NoteX n)");
}
}

public class WindError{
public static void tune(InstrumentX i){
i.play(NoteX.MIDDLE_C);
}
public static void main(String args[]){
WindX flute=new WindX();
tune(flute);
}
}

这个是可以运行的,结果为 WindX.play(NoteX n)

我做了如下改动为何不能编译,第一种:我将(1)处的(NoteX NoteX)改为(int NoteX)程序就不能编译,为啥我在这儿不能理解为play()方法的过载?
第二种改动:我将(1)到(2)处的语句全部注释掉,程序又不能运行,为什么我不能理解为WindX继承了InstrumentX后自己独立拥有的方法?
下面这段程序代码是可以运行的,但结果不是我想要的WindX.play(NoteX n)而是InstrumentX.play()
代码如下:

//: WindError.java

class NoteX{
public static final int MIDDLE_C=0;
//public static final NoteX MIDDLE_C=new NoteX();
public static final int C_SHARP=1,C_FLAT=2;
}

class InstrumentX{
public void play(int NoteX){ //(1)
System.out.println("InstrumentX.play()");
}
}

class WindX extends InstrumentX{
public void play(NoteX n){
System.out.println("WindX.play(NoteX n)");
}
}

public class WindError{
public static void tune(InstrumentX i){
i.play(NoteX.MIDDLE_C);
}
public static void main(String args[]){
WindX flute=new WindX();
tune(flute);
}
}
 
〉〉我将(1)处的(NoteX NoteX)改为(int NoteX)程序就不能编译,为啥我在这儿不能理解为play()方法的过载?
方法的重栽在此并没有错
〉〉我将(1)到(2)处的语句全部注释掉,程序又不能运行,为什么我不能理解为WindX继承了InstrumentX后自己独立拥有的方法?
子类可以有自己的方法。
问题都是是错在
public static void tune(InstrumentX i){
i.play(NoteX.MIDDLE_C);
}
你调用的是父类InstrumentX的方法,而其方法为play(int xx),而不是子类的方法play(NoteX n).
所以出现的编译错误是方法调用参数不匹配,而不是类本身的编写错误
对于你的第二段代码
调用的还是父类方法,根据你的参数是int,也只能是父类的play(int NoteX)。

只有当你的父类方法是抽象方法时,父类指向其子类对象,执行的才是子类的实现方法。
 
接受答案了.
 
后退
顶部