我对类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在执行main方法时总会返回相同的实例吗?
2)何时创建了这些实例?
答案 0 :(得分:5)
将getClass和static .class始终返回相同的实例
不,不完全是。 dog.getClass()
方法返回dog的运行时类型。
考虑以下课程:
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 :(得分:1)
只有一个Class
实例代表一个类;无论你如何得到它,你都可以放心,它是同一个实例。
例如,静态同步方法使用该确切实例进行锁定;显然,如果有多个实例,它将无法工作。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6