2013-09-01 4 views
5

У меня есть несколько вопросов о экземплярах класса Classэкземпляров класса класса

1) Правильно ли я понимаю, что сказать, для класса Dog есть только один экземпляр класса Class. Другими словами, учитывая следующие строки

Dog dog1 = new Dog(); 
Dog dog2 = new Dog(); 

Class dog1Class = dog1.getClass(); 
Class dog2Class = dog2.getClass(); 
Class dogClass = Dog.class; 

есть только один экземпляр класса Class - Class<Dog>.

Если вы сравниваете эти ссылки с ==, вы получаете, что они являются одним и тем же объектом.

Вопрос в том, будет ли getClass и static .class всегда возвращать один и тот же экземпляр во время одного запуска основного метода?

2) Когда именно эти экземпляры созданы?

+6

Если у вас есть несколько загрузчиков классов, все становится еще сложнее ... –

+0

Довольно хороший вопрос на самом деле, и как уже сказал @Oli, несколько загрузчиков классов и особенно динамическая загрузка могут бросить целую коллекцию ключей в работе. Действительно любопытно посмотреть, что на самом деле ответ. – Esko

ответ

5

будет GetClass и статические .class всегда возвращают тот же экземпляр

Нет, не совсем. dog.getClass() метод возвращает тип времени выполнения собаки.

Рассмотрим следующие классы:

class Animal { } 
class Dog extends Animal { } 

, а затем в основной метод:

Animal dog = new Dog();  
System.out.println(dog.getClass()); // Prints class Dog 
System.out.println(Animal.class);  // Prints class Animal 

Когда именно созданы эти примеры?

Когда класс впервые загружен JVM. Из документации Class:

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

Для детального исследования:

1

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

Например, статический синхронизированный метод использует этот точный экземпляр для блокировки; по-видимому, это не сработает, если есть несколько экземпляров. см. http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6

+0

Точно)) Я об этом не думал –