获取Class对象
“java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象。”(以上是在网上找的资料)
下面来看一段代码:
1 package com.hw.Class0228;
2
3 public class Demo01_GetClass {
4 public static void main(String[] args) {
5 User user1 = new User(18,"小明",98); //这里先创建两个对象
6 User user2 = new User(20,"小红",100);
7
8 Class c1 = user1.getClass(); //调用getClass()方法获取一个Class对象
9 Class c2 = user2.getClass();
10
11 System.out.println(c1==c2);
12 }
13 }
为啥输出true呢?这是因为,c1和c2都是Class对象,Class对象是什么时候创建的呢?当类被加载的时候创建的。所以当user类被加载的时候,会创建一个跟user类对应的对象。而类只会被加载一次,所以Class对象也只会被创建一次。一个类只有一个对应的Class对象。因此通过user的对象获取的时候,获取到的就是同一个对象。换句话说,不管有多少个对象,只要是user的对象,那么获取到的都是同一个对象。
我这么来一下就不是同一个对象了:
1 package com.hw.Class0228;
2
3 public class Demo01_GetClass {
4 public static void main(String[] args) {
5 User user1 = new User(18,"小明",98); //这里先创建两个对象
6 User user2 = new User(20,"小红",100);
7
8 Class c1 = user1.getClass(); //调用getClass()方法获取一个Class对象
9 Class c2 = user2.getClass();
10
11
12 Demo01_GetClass dg = new Demo01_GetClass();
13 Class c3 = dg.getClass();
14
15 System.out.println(c1==c2);
16 System.out.println(c3==c2);
17 }
18 }
为啥不一样呢?因为c2是user的对象,而c3是Demo01_GetClass的对象。所以,每一个类,都会创建一个与其对应的class对象,有且只有一个。
总结
再来看看大佬怎么说:
Class类被创建后的对象就是Class对象,Class对象表示的是自己手动编写类的类型信息,比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象,该Class对象保存了Shapes类相关的类型信息。
实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象),那为什么需要这样一个Class对象呢?是这样的,当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。注意,我们定义的一个类,无论创建多少个实例对象,在JVM中都只有一个Class对象与其对应,即:在内存中每个类有且只有一个相对应的Class对象。
。