不同对象实例的地址不同
在 Java 里,每当使用 new
关键字创建一个对象时,JVM 会在堆内存中为该对象分配一块新的内存空间,每个对象实例都有自己独立的内存地址。所以不同的对象实例,其内存地址是不同的。
以下是一个简单示例:
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class ObjectInstanceExample {
public static void main(String[] args) {
User user1 = new User("zhangsan", 20);
User user2 = new User("lisi", 25);
System.out.println(user1 == user2); // 输出 false,因为它们是不同的对象实例
}
}
在这个例子中,user1
和 user2
是两个不同的 User
对象实例,它们在堆内存中有不同的地址,所以 user1 == user2
的结果为 false
。
类的 Class
实例的唯一性
Java 里每个类在 JVM 中只有一个对应的 Class
实例,这个 Class
实例代表了该类的类型信息,它被存储在方法区(JDK 8 之前)或元空间(JDK 8 及以后)。无论通过多少个该类的对象去获取 Class
实例,或者使用 Class.forName
方法获取,最终得到的都是同一个 Class
实例。
下面是之前示例的代码:
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException {
Class userClass = Class.forName("User");
User user = new User("zhangsan", 20);
Class userClass2 = user.getClass();
User user2 = new User("lisi", 25);
Class userClass3 = user2.getClass();
System.out.println(userClass2 == userClass);
System.out.println(userClass2 == userClass3);
System.out.println(userClass == userClass3);
}
}
在这个例子中,user
和 user2
是不同的 User
对象实例,它们在堆内存中有不同的地址。但是 userClass
、userClass2
和 userClass3
都是 User
类的 Class
实例,它们指向方法区(或元空间)中同一个 Class
对象,所以 userClass2 == userClass
、userClass2 == userClass3
和 userClass == userClass3
的结果都为 true
。
综上所述,不同的对象实例地址不同,但同一个类的 Class
实例是唯一的,这就是为什么比较类的 Class
实例时结果为 true
的原因。