2015-07-14 1 views
1

Мой код в форму ниже:Внутри объекта B, как получить доступ к объекту A, который создал объект B?

public class Outer { 

    protected int data; 
    protected Inner inner; 

    protected void run() { 
     inner = new Inner(); 
    } 

} 

public class Inner extends Outer { 

    protected getOuterData() { 
     ... 
    } 
} 

Inner объект будет создан только в рамках метода класса Outer. Внутри объекта Inner существует ли способ доступа к данным экземпляра класса Outer, который создал объект Inner?

EDIT: Я понимаю, что вы можете просто передать внешний объект во внутренний объект через конструктор, но мне было интересно, есть ли другой способ?

EDIT2: Фактически передача объекта через конструктор будет ОК для того, что я делаю.

+0

Вы можете сделать 'Inner' и фактический [внутренний класс Java] (https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html). Кроме того, не нужно использовать 'Inner'' Outer', если это не так. – GriffeyDog

+0

@GriffeyDog Я займусь этим, спасибо. Inner действительно должен расширять Outer в моем фактическом коде, поэтому я его написал. – mmgro27

ответ

1
public class Outer { 

    protected int data; 
    protected Inner inner; 

    protected void run() { 
     inner = new Inner(this); 
    } 

} 

public class Inner extends Outer { 
    private Outer parent; 
    Inner(Outer parent) { 
     this.parent = parent 
    } 

    protected getOuterData() { 
     return parent; 
    } 
} 
+0

Извините, я понимаю, что могу это сделать, но мне было интересно, есть ли другой способ. Я редактировал свой пост. EDIT: На самом деле, этот способ сделать это будет работать для меня. Благодаря! – mmgro27

+0

который является вашей целью? Почему вам нужна ссылка на родительский объект? – fantarama

0

Возможно, это поможет вам.

public class Outer { 

    protected int data; 
    protected Inner inner; 

    protected void run() { 
     inner = new Inner(); 
    } 

} 

public class Inner extends Outer { 

    protected void getOuterData() { 
     Outer out = new Outer();  // Create instance of `Outer` 
     out.run();      // Create instane of `Inner` 
     Inner inner = out.inner;  // Access data from Outer instance 
     int data = out.data;   // Access data from Outer instance 
    } 
} 
+0

Решает ли ваша проблема ваша проблема? –

0

общественного класса Outer {

protected int data; 
protected Inner inner; 

protected void run() { 
    inner = new Inner(); 
} 

}

общественный класс Inner расширяет Outer {

protected getOuterData() { 
    ... 
    int localData = data;\\if not already defined with same name 
    int localData = super.data;\\if already defined with same name in Inner 
} 

}

PS: Я думаю, что вы делаете что-то неправильно путем создания Child c lass в методе родительского класса. он может идти в бесконечном цикле для создания объектов при инициализации дочернего элемента, он будет создавать родительский объект, который ставит для создания ребенка и т. д.

Чтобы избежать этого, не используйте run in constructor.

Смежные вопросы