我正在尝试处理继承和接口,并且有两个工作文件:
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仍然有效。
最佳答案
您的基类具有一个构造函数:
public testSample(String name1, String occ){
事实是:子类必须始终从其父类中调用一个构造函数。即使不写下显式构造函数,编译器也会添加默认的无参数构造函数。
因此:编译器尝试将默认的ctor添加到子类中。如前所述,该构造函数必须调用一些超级构造函数。但是:您的超类中没有默认的构造函数。
长话短说:您需要类似:
public testSample2(String name1, String occ){
super(name1, occ)
例如。
想一想:继承是关于IS A关系的。一个testSample2也是一个testSample。并且“ testSample”需要实例化这两个参数。因此,testSample2必须在创建时以某种方式提供这两个参数。
关于java - 为什么这些类之一不能从我创建的接口(interface)继承?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40888386/