为什么其中一个类没有从我创建的接口继承?

时间:2016-11-30 12:28:54

标签: java inheritance interface polymorphism

我试图了解继承和接口,并且我有两个工作文件:

interface Speaker{

  public String nameCalled();
  public void describeSelf(String s);
  public double randomIt(String s);
}

import java.util.Random;

public class testSample implements Speaker{


  public String name1;
  public String occ;

  public testSample(String name1, String occ){
    this.name1 = name1;
    this.occ = occ;
  }


  public String nameCalled(){
    return "My name is " + name1 + ".";
  }

  public void describeSelf(String s){
    System.out.println("I, " + name1 + ", am a " + occ + ".");
  }

  public double randomIt(String s){
    return Math.random() * s.length();
  }

  public static void main(String[] args){
    testSample t = new testSample("John","student");
    System.out.println(t.nameCalled());
    System.out.println(t.randomIt("money"));
  }

}

然后,用这个:

public class testSample2 extends testSample implements Speaker{

  String name;

  public String nameCalled(){};
  public void describeSelf(String s){
    System.out.println("They call me " + name + ".");
  }
  public double randomIt(String s){
    return Math.random() * s.length();
  }

}

我的编译器说"找到1个错误: 文件:C:\ Users \ user \ Desktop \ testSample2.java [line:1] 错误:类testSample中的构造函数testSample无法应用于给定类型;   required:java.lang.String,java.lang.String   发现:没有争论   原因:实际和正式的参数列表长度不同"

我希望testSample2继承testSample中的变量,但输出不同。另外,接口的重点是什么,如果在testSample上,我可以注释掉#34;实现扬声器"和testSample仍然有效。

2 个答案:

答案 0 :(得分:1)

您的基类有一个构造函数:

public testSample(String name1, String occ){

事情是:子类必须始终从其超类中调用一个构造函数。即使你没有写下显式构造函数,编译器也会添加默认的无参数构造函数。

因此:编译器尝试将该默认ctor添加到子类。如上所述,该构造函数必须调用一些超级构造函数。 但是:超类中没有默认构造函数。

长话短说:你需要类似的东西:

public testSample2(String name1, String occ){
  super(name1, occ)

例如。

想一想:继承是关于 IS A 的关系。 testSample2 也是一个testSample。并且“testSample”需要实例化这两个参数。因此,testSample2必须在创建时以某种方式提供 这两个参数。

答案 1 :(得分:0)

您的班级testSample2继承testSample

所以你需要做的是:在testSample2的构造函数中,你必须通过调用super(string, string)

来调用父类的构造函数