2 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
java中的super()是什么?
要說(shuō)super就先要說(shuō)this。
"this",作為一個(gè)特殊的關(guān)鍵字,它的規(guī)則如下:
1。可以表示構(gòu)造函數(shù)傳遞。this(a,b)表示調(diào)用另外一個(gè)構(gòu)造函數(shù)。這里面的this就是一個(gè)特殊語(yǔ)法,不是變量,沒(méi)有什么類型。
2。可以在一個(gè)類的非static成員內(nèi)部使用,表示當(dāng)前這個(gè)對(duì)象。此時(shí),this就是一個(gè)final的普通變量,它有靜態(tài)類型,就是這個(gè)類C本身;它有動(dòng)態(tài)類型,就是當(dāng)前這個(gè)對(duì)象的類型。你可以對(duì)它調(diào)用成員函數(shù),把它傳遞給別的函數(shù),等等等等。只要一個(gè)C類型的final變量可以出現(xiàn)的地方,它就可以出現(xiàn)。
"super"。它和"this"類似,但是也有不同的地方。
1。表示調(diào)用父類的構(gòu)造函數(shù)。也是一個(gè)特殊語(yǔ)法,不是變量,沒(méi)有什么類型。
2。可以在一個(gè)類的非static成員內(nèi)部使用。比如super.method()。
但是,注意,這個(gè)super.method()只是長(zhǎng)得跟some_var.method()一樣,一個(gè)語(yǔ)法糖而已。實(shí)質(zhì)上,"super"根本不是一個(gè)變量。
為什么不是?因?yàn)槿绻蔷蛪牧?。java里面有一個(gè)金科玉律:任何public非static函數(shù)的調(diào)用都是多態(tài)的。
所以,如果super是個(gè)變量,也指向當(dāng)前對(duì)象,那么,不管super的靜態(tài)類型是什么super.method()必然調(diào)用的是子類的那個(gè)版本,而不會(huì)是我們期望的,靜態(tài)地選擇父類的那個(gè)版本。
所以,你只要把super.xxx看成一個(gè)特殊的語(yǔ)法,比如理解為“super::xxx”就好了。
既然super不是一個(gè)變量,那么不能把它象一個(gè)普通變量那樣"==",或者傳遞給某個(gè)函數(shù)就看起來(lái)很正常了,是么?何況,你其實(shí)也用不著它,有this你這些要求就都可以辦到了。
3。super的另外一個(gè)作用是調(diào)用父類的protected函數(shù)。只有通過(guò)"super"這個(gè)魔咒,我們才能操作父類的protected成員,別無(wú)它法。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
由于子類不繼承父類的構(gòu)造方法,因此,子類在其構(gòu)造方法中需使用super來(lái)調(diào)用父類的構(gòu)造方法。
添加回答
舉報(bào)