2017-01-15 2 views
0

Внутренние классы могут быть созданы вне внешнего класса, используя Outer_class_object.new inner_class(). Но возникает вопрос, что происходит с объектом Outer class? означает, что ссылка на нее отсутствует. Очевидно, это будет на куче, пока внутренний объект класса не окажется в куче, потому что внутренние классы питаются внешним классом. Итак, какой механизм java использует в таких ситуациях? См. Следующий код ...
Что происходит с внешним объектом класса в основной части NormalInnerClassDemo, который мы использовали для создания объекта внутреннего класса. Он должен оставаться в живых до тех пор, пока «внутреннее» не будет живым. Нет ли ссылочной переменной, относящейся к нему, это не значит, что он имеет право на сбор мусора? Если не так, как Java удается сказать сборщику мусора, чтобы этого не сделать?
Ссылка на объект внешнего класса, когда объект класса Inner создается вне класса Outer

class Outer { 

    private String string = "Google"; 

    class Inner { 

     public Inner() { 
      System.out.println("From Inner:" + string); 
     } 
    } 

    public void test() { 
     //Some code here 
    } 
} 

public class NormalInnerClassDemo { 

    public static void main(String[] args) { 
     Outer.Inner inner = new Outer().new Inner(); 
    } 
} 
+0

ваш вопрос непонятен. вы можете создать объект внешнего класса, а также создать его в соответствии с вашими потребностями. какова ваша фактическая проблема? –

+0

В основном методе NormalInnerClassDemo мы создаем объект внутреннего класса с использованием объекта класса Outer (созданного «на лету»), который не имеет ссылочной переменной, указывающей на него. Но Наружный должен остаться в живых, пока Внутренний не будет жив.Итак, как Java говорит GC, что «не удалять внешний объект», потому что есть еще один объект «Inner», который я все еще использую! » , – omjego

+1

@omjego Внутренний экземпляр класса имеет скрытую ссылку на внешний класс, но это не имеет никакого отношения к вашему первому предложению. – EJP

ответ

1

Внутренние классы могут быть созданы вне внешнего класса с использованием Outer_class.inner_class.

Нет, они не могут. Они созданы с помощью:

outer.new Outer.Inner(...) 

, где outer является первичным-выражение, которое вычисляется в виде ссылки на экземпляр Outer, например new Outer(...).

или

this.new Inner(...) 

, если вы находитесь внутри Outer, или для короткого

new Inner(...) 

, если вы находитесь внутри Outer.

Но возникает вопрос, что происходит с объектом Outer class? означает, что ссылка на нее отсутствует.

О да, есть: см. Выше.

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

Ваш вопрос основан на ошибке.

-1

Сначала это Java, так почему вы беспокоитесь о динамической памяти, когда виртуальная машина чистит для вас? 8-)

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

Outer() { 
    System.out.println("Outer()"); 
} 

Затем запустите программу, и вы увидите, Outer создается тоже. Рад, что вас интересует, как/что создано.

+1

'Outer' не создается при создании' Inner'. Он уже должен существовать, иначе нет способа создать внутренний класс. – EJP

+0

Мы говорим то же самое. Внешний должен существовать либо до или во время создания Внутреннего. Вы создаете их вместе через новый Outer(). New Inner(), но вы DO ** создаете ** Outer в этом выражении. Подумайте об объектах как Outer CONTAINS экземпляр объекта Inner. Таким образом, переменная _inner_ ссылается на весь объект. Вот почему, если вы определяете функцию, называемую 'testInner() {test(); } 'и вызовите его через' inner-> testInner(); 'он будет работать. Переменная _inner_ действительно ссылается на полный объект с помощью Outer. – ChuckB

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

  • Нет связанных вопросов^_^