Re: [軟體] 少用的 constructor 語法
※ 引述《adrianshum (Alien)》之銘言:
: ※ 引述《macbuntu (邀怪)》之銘言:
: : 剛剛在試一些東西, 才發現 Java 裡如果繼承的 parent class 是
: : non-static inner class 而且沒有 default constructor 時,
: : 需要用一個奇怪的語法來呼叫 parent constructor:
: : class A {
: : class B {
: : class C {
: : public C(int i) {}
: : }
: : }
: : }
: : class D extends A.B.C {
: : public D() {
: : new A().new B().super(123);
: : }
: : }
: : 這種語法用的人應該不多吧? 那個 super() 這樣寫真不直覺...
: inner class 在 instantiate 時, 需要
: 一個 "outer" object.
: e.g.
: class A {
: class B {
: }
: public void foo() {
: new B(); // outer 是 this
: }
: }
: // some other place
: A a = new A();
: a.new B(); // instantiate B, 其 outer 是 a
: D 的 constructor 寫的東西, 大概不止是
: 為了 invoke super ctor, 而是順道生成其
: outer class... 吧?....
這跟 nested(inner) class 的 constructor 有關。
nested class 實做裡有參考到其他的物件/數值,是透過 nested class 的
constructor 將這些 value/ref 傳遞給 nested class instance 爾後使用。
* 編譯器會依照 nested class 參考到外部 value/ref 的數量修改你定義的
constructor。
class C 的 constructor 實際上是兩個參數,new A().new B().super(123) 是
為了多傳遞一個 A.B object 給 C constructor。
new A().new B() 則是為了在建構 A.B object 時多傳遞一個 A object 給 B
constructor。
如果把 class D 改成
class D extends A.B.C {
public D() {
this(new A());
}
public D(A a) {
//a.new B().super(123);
this(a.new B());
}
public D(A.B b) {
b.super(123);
}
}
或許看起來不會那麼奇怪。也就是說只要懂 no-static nested class 的
constructor call 一定是 enclosing_object_value.(或隱含為 this.) 為前導
這個語法。
http://www.javaworld.com.tw/jute/post/view?bid=29&id=57352&tpg=1&ppg=1&sty=1&age=0#57352
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.137.132
※ 編輯: sbrhsieh 來自: 218.173.137.132 (03/06 20:35)
※ 編輯: sbrhsieh 來自: 218.173.137.132 (03/06 20:38)
※ 編輯: sbrhsieh 來自: 218.173.137.132 (03/06 20:45)
※ 編輯: sbrhsieh 來自: 218.173.136.130 (03/06 23:12)
推
03/07 08:52, , 1F
03/07 08:52, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):