2013-03-16 62 views
1

示例代碼對象的方法:訪問字段和包含「這」對象

public class A { 
    B b = new B(); 
    int a = 17; 
} 

public class B { 
    int getA() { 
     // how to get 'a' field from object containing 'this' object 
    } 
} 

我的問題是,如在樣品代碼註釋。一般來說:如何從包含'this'對象的對象訪問字段和方法。 在我的示例中,類B將僅作爲A類中的字段實例化。

回答

2

如果您的出發點是B中的代碼,那麼您不能這樣做。沒有辦法聯繫到並找到B在虛擬機中的所有類中都使用。

此外,如果您發現自己想要這樣做,則表示您需要重新訪問您的班級結構。例如,你可能有BB構造接受A說法:

public B(A owner) { 
    // ...do something with owner object 
} 

,介紹AB之間相當緊耦合的,雖然,這可能是一個問題。您可能會將需要了解的A方面摘錄到接口中,讓A實現該接口,並使B接受使用該接口鍵入的參數。

或避免需要有B知道A,通常是最好的。

1

試試這個:

class A { 
    B b = new B(this); 
    int a = 17; 
} 

class B { 
    A a; 
    public B(A a) { 
     this.a=a; 
    } 
    int getA() { 
     return a.a; 
    } 
} 
1

創建B類的對象時,您需要傳遞給目標Athis參考:

public class A { 
    B b = new B(this); 
    int a = 17; 
} 

public class B { 
    A mA = null; 
    public B(A pA) { mA = pA; } 
    int getA() { 
     int a2 = mA.a;  
    } 
} 

另一個可能性是在B中聲明B類類A.對於這樣的一類,它的值的基準「這個」的創建封閉的類的對象時,包圍對象將自動作爲隱藏參數傳遞:

public class A { 
    B b = new B(); 
    int a = 17; 

    public class B { 
    int getA() { 
     int a2 = A.this.a; 
    } 
    } 
} 

注意,如果聲明的類B作爲靜態,這會將內部類B轉換爲普通頂級類,並且外部類的this的值將不再執行。

1

你必須要麼儲存到A實例的引用:

public class A { 
    B b = new B(this); 
    int a = 17; 
} 

class B { 
    public B(A a) { 
     this.a = a; 
    } 

    private final A a; 

    int getA() { 
     return a.a; 
    } 
} 

...或者,如果AA是指爲常數,聲明爲這樣:

public class A { 
    B b = new B(this); 
    public static final int a = 17; 
} 

class B {  
    int getA() { 
     return A.a; // but then you could use A.a at the call site anyway 
    } 
} 

哪種效果最好對你而言,取決於你正試圖解決的實際問題。你應該發佈你的真實代碼以獲得進一步的建議