【问题标题】:Why is one of these classes not inheriting from the interface I made?为什么这些类之一没有从我创建的接口继承?
【发布时间】:2017-04-14 18:39:36
【问题描述】:

我正在尝试处理继承和接口,我有两个工作文件:

interface Speaker{

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

导入 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 [行:1] 错误:类 testSample 中的构造函数 testSample 不能应用于给定类型; 必需:java.lang.String,java.lang.String 发现:没有参数 原因:实际参数列表和形式参数列表的长度不同”

我希望 testSample2 从 testSample 继承变量,但输出不同。另外,接口的意义何在,如果在testSample上,我可以注释掉“implements Speaker”并且testSample仍然有效。

【问题讨论】:

  • 提示:请阅读 java 命名约定。类名总是大写。并且:不要调用“testClass”... 对预期用途nothing 的东西。至少称它为 BaseTestClass,然后是 ExtendingTestClass 或类似的东西。

标签: java inheritance interface polymorphism


【解决方案1】:

你的类testSample2在继承testSample

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

【讨论】:

    【解决方案2】:

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

    public testSample(String name1, String occ){
    

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

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

    长话短说:你需要这样的东西:

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

    例如。

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

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 1970-01-01
      • 2017-10-05
      • 2010-11-05
      • 2011-05-06
      • 1970-01-01
      • 2013-05-14
      • 2022-11-18
      相关资源
      最近更新 更多