亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java構造器繼承

Java構造器繼承

素胚勾勒不出你 2019-12-18 17:13:39
Java構造器繼承我想知道為什么在java構造函數中沒有繼承?你知道當你有這樣一堂課的時候:public class Super {   public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){     this.serviceA = serviceA;     //etc   } }稍后,當您繼承Super,java會抱怨沒有定義默認構造函數。解決方案顯然是這樣的:public class Son extends Super{   public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){     super(serviceA,serviceB,serviceC);   }}這個代碼是重復的,不是干的和無用的(IMHO).因此,這再次提出了一個問題:為什么java不支持構造函數繼承?不允許這種繼承有什么好處嗎?
查看完整描述

3 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

假設構造函數都是遺傳的.。因為每個類最終都是從對象派生出來的,每一,每個類將以無參數構造函數結束。餿主意。你到底期望什么:

FileInputStream stream = new FileInputStream();

去做?

現在可能有一種方法可以輕松地創建“通過”構造函數,這是相當常見的,但我不認為它應該是默認的。構造子類所需的參數通常與超類所需的參數不同。



查看完整回答
反對 回復 2019-12-19
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

當你從超級繼承時,這就是現實中發生的事情:

public class Son extends Super{

  // If you dont declare a constructor of any type, adefault one will appear.
  public Son(){
    // If you dont call any other constructor in the first line a call to super() will be placed instead.
    super();
  }}

所以,這就是原因,因為你必須調用你唯一的構造函數,因為“Super”沒有默認的構造函數。

現在,嘗試猜測為什么Java不支持構造函數繼承,可能是因為構造函數只有在討論具體實例時才有意義,而且當您不知道如何(通過多態)定義某物的實例時,您不應該能夠創建它的實例。



查看完整回答
反對 回復 2019-12-19
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

因為構建子類對象的方式可能與構建超類的方式不同。您可能不希望子類的客戶端能夠調用超類中可用的某些構造函數。

一個愚蠢的例子:

class Super {
    protected final Number value;
    public Super(Number value){
        this.value = value;
    }}class Sub {
    public Sub(){ super(Integer.valueOf(0)); }
    void doSomeStuff(){
        // We know this.value is an Integer, so it's safe to cast.
        doSomethingWithAnInteger((Integer)this.value);
    }}// Client code:Sub s = new Sub(Long.valueOf(666L)):
     // Devilish invocation of Super constructor!s.doSomeStuff(); 
    // throws ClassCastException

或者更簡單:

class Super {
    private final String msg;
    Super(String msg){
        if (msg == null) throw new NullPointerException();
        this.msg = msg;
    }}class Sub {
    private final String detail;
    Sub(String msg, String detail){
        super(msg);
        if (detail == null) throw new NullPointerException();
        this.detail = detail;
    }
    void print(){
        // detail is never null, so this method won't fail
        System.out.println(detail.concat(": ").concat(msg));
    }}// Client code:Sub s = new Sub("message");
     // Calling Super constructor - detail is never initialized!s.print();
      // throws NullPointerException

從本例中可以看出,您需要某種方式聲明“我想繼承這些構造函數”或“我想繼承除這些構造函數之外的所有構造函數”,然后還必須指定默認構造函數繼承首選項,以防有人在超類中添加新構造函數.或者,如果您想要“繼承”它們,那么只需要從超類中重復構造函數,這可以說是更明顯的方法。




查看完整回答
反對 回復 2019-12-19
  • 3 回答
  • 0 關注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號