作者sbrhsieh (sbr)
看板java
标题Re: [软体] 少用的 constructor 语法
时间Fri Mar 6 20:25:28 2009
※ 引述《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)