外观
Object obj = new Object(); 其中的 obj 是什么?是内存地址吗
在 Object obj = new Object();
这行代码中,obj
并不是内存地址,而是一个引用变量
引用变量的本质
在 Java
里,当执行 Object obj = new Object();
时,实际发生了两个关键步骤:
- 对象的创建:
new Object()
这个表达式在堆内存中为Object
类的一个实例分配了一块内存空间,这块内存空间包含了Object
类实例的各种属性和状态信息。 - 引用变量的赋值:
obj
是一个引用变量,它被存储在栈内存中。这个引用变量存储的是堆内存中刚刚创建的Object
实例的内存地址,也就是说,obj
指向了堆内存中的那个Object
实例。
可以把 obj
想象成一个指向实际对象的 “指针”,通过这个引用变量,我们就可以访问和操作堆内存中的对象。例如,可以使用 obj
调用 Object
类的方法:
public class ReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
// 调用 Object 类的 toString() 方法
String str = obj.toString();
System.out.println(str);
}
}
在上述代码中,通过 obj
引用变量调用了 Object
类的 toString()
方法,实际上是通过 obj
存储的内存地址找到堆内存中的 Object
实例,然后执行该实例的 toString()
方法。
与内存地址的区别
虽然 obj
存储的是对象的内存地址,但它和传统意义上的内存地址概念有所不同:
类型安全性:在
Java
中,引用变量是有类型的,obj
被声明为Object
类型,这意味着编译器会对通过obj
进行的操作进行类型检查,确保操作的合法性。而单纯的内存地址没有类型信息,容易引发各种安全问题。自动内存管理:
Java
有自动的垃圾回收机制,当一个对象不再被任何引用变量引用时,垃圾回收器会自动回收该对象占用的内存空间。引用变量和对象的生命周期紧密相关,通过引用变量可以控制对象的可达性,进而影响对象是否会被回收。
综上所述,obj
是一个引用变量,它存储了对象在堆内存中的地址,是我们在 Java 中操作对象的重要方式。