我有类SearchToUser和getFilesToWord。 GetFilesToWord必须继承SearchToUser字段。如果SearchToUser类中为空构造,则扩展有效,否则:
cannot find symbol
symbol : constructor SearchToUser()
location: class SearchToUser
public class GetFilesToWord extends SearchToUser{
^
1 error
make: *** [all] Error 1
我无法理解为什么扩展需要空构造函数。
[补充]
- ALERT ERRR!使用成分!留下“坏”的例子 - Composition VS Inheritance
它有效,但你能发现一些弱点吗?我可以将searchTerm设为私有,为它创建公共方法,为GetFilesToWord中的参数创建SearchToUser对象吗?
SearchToUser.java
public class SearchToUser {
public static GetFilesToWord geader;
public static String searchTerm;
SearchToUser(String s){
searchTerm=s.trim().toLowerCase();
files=geader.getFilesToWord(s);
}
...
}
GetFilesToWord.java
public class GetFilesToWord extends SearhToUser{
public GetFilesToWord(){super(SearchToUser.searchTerm){
...
}
答案 0 :(得分:16)
超类不需要专门的空构造函数。子类只需要调用超类中的构造函数。如果超类具有公共或受保护的无参数构造函数,则会自动调用它,否则您需要显式。
public class Super {
}
public class Sub extends Super {
}
这里,Super
指定没有构造函数,因此添加了一个构造函数。 Sub
也是如此。以上看起来真的像这样:
public class Super {
public Super() {
}
}
public class Sub extends Super {
public Sub() {
super();
}
}
public class Super {
public Super() {
}
}
public class Sub extends Super {
}
这是合法的。构造函数被添加到Sub
,调用Super
的默认构造函数。
public class Super {
public Super(int i) {
}
}
public class Sub extends Super {
}
这是一个像你一样的编译错误。因为Super
具有构造函数,所以编译器不会自动添加no-arg构造函数。解决这个问题的方法是:
public class Super {
public Super(int i) {
}
}
public class Sub extends Super {
public Sub() {
super(0); // <-- explicit constructor call
}
}
答案 1 :(得分:2)
从技术上讲,它不是......但是如果你没有在GetFilesToWord
中明确地提供显式调用超类构造函数的构造函数,Java将自动插入对无参数超类构造函数的调用。但是如果没有无参数超类构造函数,Java就不知道为参数提供什么值,并且它不能自动插入调用。然后,您必须使用适当的值手动调用超类构造函数。
根本需要调用超类构造函数的原因是,以一种方式,构造GetFilesToWord
的操作在其中包括构造SearchToUser
的操作。例如,如果您在SearchToUser
中有实例变量,则在创建GetFilesToWord
时以及仅创建普通SearchToUser
时需要初始化它们。