Доступ к методам внутреннего класса для уже созданного объекта внешнего класса

#java #inner-classes #nested-class

#java #внутренние классы #вложенный класс

Вопрос:

Допустим, у меня есть такой класс:

 class Outer { 
   public void getOuterValue() { } 

   class Inner { 
       public void getInnerValue() { }
   } 
} 
  

Я понимаю, что я мог бы создать объект этого класса как:

 Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
  

Но давайте предположим, что я получаю этот объект из какого-то другого метода:

 void someMethodSomewhere(Outer o) { 
        // How do I call getInnerValue() here using o? 
} 
  

Есть ли способ вызвать метод «getInnerValue», используя «o» в приведенном выше сценарии?

Пожалуйста, дайте мне знать.

Комментарии:

1. Я попробовал «o.getInnerValue ()», к сожалению, это не сработало.

2. @LutzHorn Нет, ты не можешь этого сделать. Inner — это экземпляр члена, для которого требуется экземпляр Outer , следовательно, outer.new Inner , а не new Outer . Inner()

3. @Lutz Horn Нет, это не может работать! Может быть произвольное количество объектов типа Inner , поэтому это даже теоретически не может работать.

Ответ №1:

Нет. Вам нужно иметь экземпляр Inner для вызова методов на нем.

Экземпляра внешнего класса недостаточно (это будет работать наоборот: экземпляр внутреннего класса имеет ссылку на экземпляр внешнего класса).

Комментарии:

1. Я вижу. Итак, я думаю, мне нужно было бы избавиться от внутреннего класса и иметь метод для внешнего класса.

2. Или передать экземпляр Inner .

3. Имеет смысл. Спасибо за вашу помощь.

Ответ №2:

 void someMethodSomewhere(Outer o) { 
    // How do I call getInnerValue() here using o? 
} 
  

Вы не можете. getInnerValue() — это метод во внутреннем. Внешний не является внутренним и не имеет ссылки на внутренний. Когда вам передают o , нет способа перейти от этого к любому экземпляру Inner, потому что с ним не связан ни один o .

Комментарии:

1. Есть ли способ связать его с «o»? Я думаю, я мог бы сохранить экземпляр «Inner» в «Outer»

2. Если o бы у вас был экземпляр Inner, то да, конечно. Это ничем не отличалось o бы от наличия экземпляра StringBuffer или ArrayList или чего-либо еще. Код, как написано в описании, не включает в себя какой-либо экземпляр Inner, принадлежащий или доступный из o .

3. Да, я надеялся не сохранять этот экземпляр, поэтому я не включил его в описание. Спасибо за объяснение!