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

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

不必在構造函數中放置super()嗎?

不必在構造函數中放置super()嗎?

鴻蒙傳說 2019-10-15 13:58:18
如果不將其放在子類的構造函數中,這不是由編譯器自動放置的嗎?那意味著我什至不需要關心它?他們在某些文章中將其淘汰。如果我有一個帶參數的構造函數,這將是構造函數,還是需要一個不帶參數列表的構造函數?
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

首先是一些術語:


無參數構造函數:無參數的構造函數;

可訪問的無參數構造函數:超類中的無參數構造函數對子類可見。這意味著它是公共的或受保護的,或者,如果兩個類都在同一個包中,則訪問包;和

默認構造函數:類中沒有顯式構造函數時,編譯器添加的公共no-args構造函數。

因此,所有類都至少具有一個構造函數。


子類的構造函數可以在執行子類的構造函數中的代碼之前,首先指定要調用超類中的哪個構造函數。


如果子類構造函數未指定要調用的超類構造函數,則編譯器將自動調用超類中可訪問的no-args構造函數。


如果超類沒有no-arg構造函數或不可訪問,則未指定要調用的超類構造函數(在子類構造函數中)是編譯器錯誤,因此必須指定。


例如:


public class Base { }

public class Derived extends Base { }

這很好,因為如果不顯式添加構造函數,則Java會為您放置一個公共的默認構造函數。


public class Base { }

public class Derived extends Base { public Derived(int i) { } }

還可以


public class Base { public Base(String s) { } }

public class Derived extends Base { }

上面是編譯錯誤,因為Base沒有默認構造函數。


public class Base { private Base() { } }

public class Derived extends Base { }

這也是一個錯誤,因為Base的no-args構造函數是私有的。


查看完整回答
反對 回復 2019-10-15
?
胡說叔叔

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

調用無參數的超級構造函數只會浪費屏幕空間和程序員時間。無論您是否編寫,編譯器都會生成完全相同的代碼。


class Explicit() {

    Explicit() {

        super();

    }

}


class Implicit {

    Implicit() {

    }

}

更新(2018年12月):


編寫顯式super()代碼有助于在IDE中導航源代碼。


截至2018年12月,Eclipse和IntelliJ均未提供任何從派生類的構造函數導航到基類的構造函數的方法。


查看完整回答
反對 回復 2019-10-15
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

即使不調用子默認構造函數,也會調用默認父構造函數。


主要


public class Main {


    public static void main(String[] args) {

        A a = new B();

    }

}

一種


public class A {


    public A() {

        System.out.println("A");

    }

}


public class B extends A {


    public B() {

        System.out.println("B");

    }

}

版畫


A

B


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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