2016-05-16 2 views
0

Мы говорим, что вложенные классы: членов прилагаемого класса.Имеет ли каждый экземпляр окружающего класса свою собственную копию внутреннего/нестатического вложенного класса?

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


Мой вопрос не дубликат question связанного в баннере над моим вопросом.

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

Мой вопрос в том, что, поскольку все экземпляры класса имеют свои собственные копии всех нестатических членов полей (и методов? - я не уверен в методах) - против статических членов, которые имеют только одну копию, которая доступна ко всем экземплярам класса; и поскольку мы говорим, что вложенные классы являются членами классов, а затем внутренними классами станут нестатических/экземпляров-членов окружающих классов, не так ли?

Итак, можно ли заключить, что каждый экземпляр охватывающего класса имеет свою копию каждого внутреннего класса?

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

На мой вопрос был точно поставлен ответ в принятом ответе.

+3

Почему бы просто не попробовать? – Turing85

+1

"так же, как каждый экземпляр класса имеет свою собственную копию метода нестатического/экземпляра?" но они этого не делают. – Kayaman

+1

Входящий класс [single] может иметь * множественные * внутренние классы: что означают эти множественности? – user2864740

ответ

3

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

public class Outer { 
    class Inner { 

    } 

    public Inner inner = new Inner(); 

    public static void main(String... args) { 
     Outer o1 = new Outer(); 
     Outer o2 = new Outer(); 

     System.out.println(o1.inner == o2.inner); 
     System.out.println(o1.inner.getClass() == o2.inner.getClass()); 
    } 

} 

При выполнении программы, вы можете увидеть, что экземпляры Inner не равны, но классы внутренних экземпляров. Надеюсь, это ответит на ваш вопрос.

+0

Из этого я могу заключить, что _inner-class_ для каждого экземпляра окружающего класса всегда один и тот же; но каждый экземпляр окружающего класса имеет свою собственную копию всего экземпляра своего внутреннего класса_ - это правильно? – Solace

+1

Да, это правильно. – Turing85

+0

Большое спасибо, и вы были правы, когда сказали: «Почему бы просто не попробовать» (вот почему я поддержал комментарий), но мне просто не приходило в голову проверить это так. Я еще не узнал о рефлексии (getClass()). – Solace

0

Означает ли это, что каждый экземпляр класса приложения имеет свою собственную копию (п) внутренний/нестатический-вложенный класс,

Каждый экземпляр класса приложения может ссылаться на ноле или больше экземпляров внутреннего класса.

Каждый экземпляр внутреннего класса имеет неявную ссылку только на один экземпляр охватывающего класса.

К слову, внутренний класс - это вложенный класс, который не объявлен статическим. «Внутренний класс» включает как анонимные, так и нестатические вложенные классы.

+0

@vaxquis - Это была действительная критика моего более раннего языка. Внешний экземпляр не подразумевает подключение к внутреннему экземпляру. Использование глагола «имеет» означает «ссылается на», это немного растягивается. –

+0

@ AndyThomas It * есть * стрейч, правда. Тем не менее, они неявно связаны в ссылочном графе (GC и т. Д.), Но, конечно, я согласен, что вы не можете просто получить все внутренние экземпляры [без тяжелой магии VM] (http://docs.oracle.com/javase/ 1.5.0/docs/guide/jvmti/jvmti.html # IterateOverInstancesOfClass) или без какого-либо явного отслеживания. – vaxquis

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