簡體   English   中英

Java:為什么擴展需要一個空的構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM