2012-03-30 103 views
2
public class A { 
    protected int x; 
    public A(int x) { this.x = x; } 
    public void g() { System.out.println(x); } 
    public void h() { System.out.println(x + 10); } 
} 
public class B { 
    public void f() { 
    (new A(2) { 
    public void g() { 
     h(); 
    } 
    }).g(); 
    } 
} 

public static void main(String[] args) { 
    new B().f(); 
} 

一些機構可以幫我瞭解這一行代碼:嵌套類匿名類

new A(2) { public void g() {h();} }).g(); 

如果他用在這裏定義一個匿名類,我不明白?以及他在匿名時如何參考A.h()?

回答

3

他創建了一個匿名類並覆蓋g()。這與您使用Runnableoverride運行時的情況相同。

(new A(2) { public void g() {h();} }).g(); 

意味着

class C extends A 
{ 
    public C() 
    { 
     super(2); 
    } 

    @Override 
    public void g() 
    { 
     this.h(); 
    } 
} 

(new C()).g(); // or C c = new C(); c.g(); 
4

該行創建一個覆蓋父類g()方法的非命名類,以便它執行一項新操作:調用h()。然而,它立即在這個非命名類上調用g()方法。

+1

所以A(2)這裏是不是新類的名稱,它是對非名稱類不重寫一個父類?請糾正我 – nabil 2012-03-30 11:06:26

+0

A(2)意味着這個新的匿名類同時被構造函數參數2實例化。 – jabal 2012-03-30 11:08:06

2

您所引用的行定義了一個新的匿名類,它將​​和Overridesg()然後調用它。

由於匿名類擴展了A,它體現的h()定義,因此它可以被調用