[英]Java: why does extending need an empty constructor?
我有類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! 使用成分! 左邊是一個“壞”的例子 - 組合VS繼承
它有效,但你能發現一些弱點嗎? 我可以將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){
...
}
超類不需要專門的空構造函數。 子類只需要調用超類中的構造函數。 如果超類具有公共或受保護的無參數構造函數,則會自動調用它,否則您需要顯式。
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
}
}
從技術上講,它不是......但如果你沒有在GetFilesToWord
中顯式提供顯式調用超類構造函數的構造函數,Java將自動插入對無參數超類構造函數的調用。 但是如果沒有無參數超類構造函數,Java就不知道為參數提供什么值,並且它不能自動插入調用。 然后,您必須使用適當的值手動調用超類構造函數。
完全需要調用超類構造函數的原因在於,以一種方式,構造GetFilesToWord
的操作在其中包括構造SearchToUser
的操作。 例如,如果在SearchToUser
有實例變量,則在創建GetFilesToWord
以及僅創建普通的SearchToUser
時需要初始化它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.