6

我对 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)这些实例究竟是什么时候创建的?

4

2 回答 2

5

getClass 和 static .class 将始终返回相同的实例

不,不完全是。dog.getClass()方法返回狗的运行时类型。

考虑以下类:

class Animal { }
class Dog extends Animal { }

然后在 main 方法中:

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

这些实例究竟是什么时候创建的?

当类第一次被 JVM 加载时。来自Class的文档:

类对象由 Java 虚拟机在加载类时自动构造,并通过调用类加载器中的 defineClass 方法来构造。

详细研究:

于 2013-09-01T15:05:25.977 回答
1

只有一个Class实例代表一个类;无论您如何获得它,您都可以放心,它是同一个实例。

例如,静态同步方法使用该确切实例进行锁定;如果有多个实例,显然它将不起作用。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6

于 2013-09-01T16:17:05.343 回答