2017-12-21 8 views
3

この情報は、おそらくどこかに存在しますが、私はそれが Javaはどのようにオブジェクトが

だから私のプログラムの主な方法 fooが対象 barを作成した場合の検索に使用するキーワードがわからない作成したクラスを参照することができます別のクラス、どのように bar fooの方法を参照することができます。

public class Foo{ 

    Bar baz = new Bar(); 

    public Foo(){} 

    public int getNum(){ 

     return 3; 

    } 
} 

public class Bar{ 

    public Bar(){ 

    /*Somehow use getNum*/ 

    } 
} 

私はおそらくBarfooを拡張、またはfooオブジェクトを作成する可能性があります。

問題はfooオブジェクトが既に存在しています(barを作成したもの)、それを参照する方法がわかりません。

+4

'Foo'インスタンスを' Bar'に渡します。 'new Bar(this)'を呼び出し、 'Bar'コンストラクタ' public Bar(Foo foo) 'を変更します。 – tsolakp

+0

また、循環依存を引き起こす可能性があります。 'getNum'が' Foo'のコンストラクタで初期化されるいくつかのインスタンス変数に依存する場合、 'Bar'コンストラクタから呼び出されると失敗します。 – tsolakp

+0

ありがとう、これは私が必要とするものです!速く、短くてシンプル –

答えて

3

オブジェクトを使用すると、コンストラクタへの参照を渡すことによって、それらを伝える必要がありますので、クラスは彼らに*を作成したのか分からない。

private final Foo foo; 
public Bar(Foo foo) { 
    this.foo = foo; 
} 
... 
public class Foo { 
    Bar baz = new Bar(this); 
    ... 
} 

*内部クラスのオブジェクトは、その外部オブジェクトへの参照を暗黙的に取得しますが、それらを作成したクラスである必要はありません。作成するクラスへの参照を常に取得する唯一のオブジェクトは、メソッドローカルおよび匿名クラスのオブジェクトです。

2

FooフィールドをBarクラスに作成し、Fooパラメータを取るBarのコンストラクタを作成します。コンストラクタを使用して、フィールドのインスタンスを設定します。今あなたがしなければならないすべては、コンストラクタにthisキーワードを渡しです:

public class Foo { 
    Bar baz = new Bar(this); 

    public Foo() { 
    } 

    public int getNum() { 
     return 3; 
    } 
} 
public class Bar { 
    private Foo parent; 

    public Bar(Foo foo) { 
     this.parent = foo; 
    } 
    public Foo getParent() { 
     return parent; 
    } 
}