2012-06-10 3 views
0

Так что это может быть очень простой вопрос, который я overthinking, но если я что-то вроде следующего:Правильный доступ к методам и переменным родителям?

class A{ 
    public String test_string = "before (default)"; 
    public A(){ 
     B b = new B(this); 
    } 
    public void testA(){ 
     this.test_string = "after (new)"; 
    } 
} 

где В:

class B{ 
    private A parent; 
    public B(A mParent){ 
     parent = mParent; 
    } 
    private void testB(){ 
     System.out.println(parent.test_string); 
    } 
} 

Would, что позволит мне еще получить доступ к тот же экземпляр A (все его общедоступные поля и методы)? Если я позвонил A.testA() из другого класса где-то еще в этом конкретном экземпляре A, был бы B, который был сконструирован в том, что функция 1 конструктора testB возвращает строку "after (new)"? Или это будет копия A, потому что не присваивает java значение, а не ссылку? Есть ли лучший способ сделать это? Я только что усложнил проблему?

Я не был уверен, что искать, поэтому я не мог найти другие вопросы, которые отвечали на мой вопрос.

Заранее благодарен!

+0

Что-нибудь, в частности, не позволяет вам открыть новый файл кода и просто попробовать его? –

ответ

1

Да, это тот же экземпляр. Он работает, как показано на этой картинке:

enter image description here

Таким образом, вызов метода над b.parent.foo, он подозвал тот же экземпляр передается в конструктор.

+0

Спасибо! Изображение тоже полезно. – Brandon

2

Он нарушает инкапсуляцию, чтобы иметь открытые поля в классе и получать к ним доступ. Пожалуйста, заверните их в аксессуар, если они у вас есть.

Кроме того, если вы будете придерживаться по правилу «сказать не проси», то на самом деле ваш код будет:

private void testB(){ 
    parent.printTestString(); 
} 

и А вы бы

public void printTestString(){ 
    System.out.println(test_string); 
} 

В ответ на ваш вопрос

«Позволяет ли я получить доступ к одному экземпляру A (все его общедоступные поля и методы)? Если я вызвал A.testA() из другого класса где-то еще на этом конкретном экземпляре A"

Да, если бы это был тот же самый экземпляр.

«был бы ли B, который был построен в функции тестового Б конструктора, возвращает« после (новую) «строку?»?

Да было бы, поле члена будет указало на новую ссылку струнной поэтому любое использование этого экземпляра бы получить такое же значение (threadsafety несмотря на это)

+0

Спасибо за разъяснение! – Brandon

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