在程序中应用接口和抽象类的概念

时间:2017-02-05 20:11:10

标签: java interface abstract-class

我正在研究这个问题而且我想知道我做对了。

考虑具有常量数据成员TYPE的接口MusicInterface, 它等于'Nice Music'和方法play(),它显示TYPE 安慰。 StringedInstrument类实现了接口 MusicInstrument。

i)编写MusicInstrument接口的Java代码。

ii)实现具有变量的抽象类StringedInstrument numberOfStrings类型为integer,类型为String类型。没有 此时可以实现方法播放。

iii)实施具体类型的ElectricGuitar,它是的子类 StringedInstrument有一个初始化名称和的构造函数 numberOfStrings和适当的方法。

MusicInstrument类

public interface MusicInterface {

  final String TYPE= "Nice Music";

  public void play();

}

StringedInstrument类

public abstract class StringedInstrument implements MusicInterface {
    public int numberOfStrings;
    public String name;
}

ElectricGuitar课程

public class ElectricGuitar extends StringedInstrument{

  public ElectricGuitar(int numberOfString, String name){
    super();
  }

@Override
public void play() {

    System.out.println("The type of music is: "+TYPE);
    }

 }

这个问题似乎非常简单,所以我想知道我是否在理解它时犯了错误。

3 个答案:

答案 0 :(得分:1)

编写传统Java代码的一些注意事项:

将Abstract类StringedInstrument中声明的字段的可见性更改为至少protected(或包私有)。这些字段是类的状态的一部分,应该被适当地封装。

此外,您的ElectricGuitar构造函数有点无用。它接收2个从未使用过的参数,StringedInstrument各自的字段保持未初始化状态。您应该在StringedInstrument中创建匹配的构造函数,并初始化其中的numberOfStringsname字段,如:

public StringedInstrument(int numberOfString, String name){
    this.numberOfStrings = numberOfStrings;
    this.name = name;
}

ElectricGuitar将使用此超级构造函数:

public ElectricGuitar(int numberOfStrings, String name){
    super(numberOfStrings, name);
}

答案 1 :(得分:1)

如果StringedInstrument类不包含任何多态抽象方法,则没有特别的理由是抽象的。我不认为这个背景会满足抽象无效的恰当例子。

话虽如此,无论你是否抽象,你都应该包含在StringedInstrument中:

public StringedInstrument(int numberOfStrings, String name) {
     this.numberOfStrings = numberOfStrings;
     this.name = name;
}

和电吉他:

public ElectricGuitar(int numberOfStrings, String name) {
    super(numberOfStrings, name);
}

我想如果你把TYPE放在StringedInstrument中,你可以这样做:

public abstract String getType();

然后在你的特定类(ElectricGuitar)中定制getType()产生的内容,这也是一个非常弱的接口使用。

答案 2 :(得分:-1)

public abstract class StringedInstrument implements MusicInterface {
public int numberOfStrings;
public String name;

public StringedInstrument()
{
    // This gets called by ElectricGuitar() constructor
}

 @Override
 public void play() 
{
    // I meant, you can also HAVE AN IMPLEMENTATION HERE. My Corrections
    // OMITTING THIS METHOD BODY DECLARATION, WON'T CAUSE COMPILE ERRORS
    //  THAT WAS A BAD JOKE BY ME
    System.out.println("The type of music is: "+TYPE + " In " + this.getClass().getSimpleName() );
}


}

你的守则坚实