Discussion:
[問題] 建構子和this super的問題
(时间太久无法回复)
艾德華
2007-07-20 04:48:57 UTC
Permalink
新手發問,請指教@@

想請問一下在繼承時的建構子裡面,如果子類別的建構子中有

出現this或是super是不是執行的順序會先是super(或this)

然後才是父類別的建構子?

也就是說順序是->子類別建構子->先執行父類別建構子(當有this時先執行)

->然後才是子類別建構子內容

例如

class A{
A(){
....
}
} //不管是否帶參數的建構子

class B extends A{
B(){
this('a'); //先執行這行,才執行建構子A()?
}
}
public class Extends1{
public static void man(String[] args){
B b=new B();
}
}

不知道看不看的懂我的問題.感謝ORZ

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.81.247
c***@kkcity.com.tw
2007-07-20 09:15:00 UTC
Permalink
Post by 艾德華
想請問一下在繼承時的建構子裡面,如果子類別的建構子中有
出現this或是super是不是執行的順序會先是super(或this)
===>一個建構子的第一行,一定是this或是super(如果user沒設,預設是super();
),所以一定會先執行this 或是super
Post by 艾德華
然後才是父類別的建構子?
====>會不會呼叫到父類別的建構子,要看你是寫了this還是super
Post by 艾德華
也就是說順序是->子類別建構子->先執行父類別建構子(當有this時先執行)
->然後才是子類別建構子內容
===>當你寫了this時,是指呼叫這個子類別的另一個建構元(看是否有傳參數)
,super()才是呼叫父類別的建構子
Post by 艾德華
例如
class A{
A(){
....
}
} //不管是否帶參數的建構子
class B extends A{
B(){
this('a'); //先執行這行,才執行建構子A()?
}
}
public class Extends1{
public static void man(String[] args){
B b=new B();
}
}
不知道看不看的懂我的問題.感謝ORZ
===>以上的程式,是會編譯錯誤的,當你呼叫了B(),執行到 this('a'),是指呼叫
B類別裡的另一個建構子,而它的參數是字元,如果你在B類別裡加上
B(char x){super();},編譯才會成功
--
┌─────◆KKCITY◆─────┐  KKBOX◤歌名╱歌手╱歌詞╱專輯◢搜尋 
│ bbs.kkcity.com.tw │   ★ http://www.kkbox.com.tw ★
└──《From:220.138.37.189 》──┘ 超過100家唱片公司合法授權 音樂盡情下載
--
Alien
2007-07-20 11:41:54 UTC
Permalink
※ 引述《***@kkcity.com.tw ( )》之銘言:
: ※ 引述《***@ptt.cc (艾德華)》之銘言:
: > 新手發問,請指教@@
: > 想請問一下在繼承時的建構子裡面,如果子類別的建構子中有
: > 出現this或是super是不是執行的順序會先是super(或this)
: ===>一個建構子的第一行,一定是this或是super(如果user沒設,預設是super();
: ),所以一定會先執行this 或是super
錯. 見下面


: > 然後才是父類別的建構子?
: ====>會不會呼叫到父類別的建構子,要看你是寫了this還是super
錯.

無論如何, parent class 的 constructor 是會先跑的.
就算跑別另一個 constructor, 最先跑的還是parent class
的 constructor


: > 也就是說順序是->子類別建構子->先執行父類別建構子(當有this時先執行)
: > ->然後才是子類別建構子內容
: ===>當你寫了this時,是指呼叫這個子類別的另一個建構元(看是否有傳參數)
: ,super()才是呼叫父類別的建構子
但你 invoke 的另一個 constructor, 最先還是會
invoke parent class 的 constructor.

: > 例如
: > class A{
: > A(){
: > ....
: > }
: > } //不管是否帶參數的建構子
: > class B extends A{
: > B(){
: > this('a'); //先執行這行,才執行建構子A()?
: > }
: > }
: > public class Extends1{
: > public static void man(String[] args){
: > B b=new B();
: > }
: > }
: > 不知道看不看的懂我的問題.感謝ORZ
: ===>以上的程式,是會編譯錯誤的,當你呼叫了B(),執行到 this('a'),是指呼叫
: B類別裡的另一個建構子,而它的參數是字元,如果你在B類別裡加上
: B(char x){super();},編譯才會成功

加上
B(char x) {} 就行了, 不需 super() 也行.
因為 default 是會幫你 invoke super 的 no-arg
constructor 的.

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.22.246.26

Loading...