Java中,對(duì)象的引用是指一個(gè)變量,通過該變量可以訪問對(duì)象的所有屬性和方法。對(duì)象的地址是指這個(gè)對(duì)象在內(nèi)存中的位置,也就是內(nèi)存中的地址。
當(dāng)定義一個(gè)對(duì)象的變量時(shí),實(shí)際上是在內(nèi)存中開辟了一塊空間用于存放該變量所引用的對(duì)象。這個(gè)空間的大小取決于對(duì)象的類型和屬性。
例如,我們定義一個(gè)Person類:
public class Person { private String name; private int age; // 構(gòu)造方法 public Person(String name, int age) { this.name = name; this.age = age; } // getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
現(xiàn)在我們創(chuàng)建一個(gè)Person對(duì)象:
Person p1 = new Person("Tom", 20);
這里的p1是一個(gè)Person類型的變量,它是一個(gè)引用類型。new操作符返回一個(gè)指向Person對(duì)象的引用,然后將這個(gè)引用賦值給p1變量。
此時(shí),內(nèi)存中的情況如下:
+--------------+ | Person | |--------------| | name="Tom" | | age=20 | +--------------+ +--------------+ | p1 | |--------------| | 0x123456 | +--------------+
左邊是Person對(duì)象在內(nèi)存中的結(jié)構(gòu),右邊是p1變量在內(nèi)存中的結(jié)構(gòu)。我們可以看到,p1變量指向的是0x123456地址,這個(gè)地址指向了具體的Person對(duì)象。
當(dāng)使用p1調(diào)用對(duì)象的方法或修改對(duì)象的屬性時(shí),實(shí)際上是通過p1變量所指向的內(nèi)存地址來訪問具體的Person對(duì)象。
需要注意的是,當(dāng)我們創(chuàng)建一個(gè)新的Person對(duì)象并將它賦值給p1變量時(shí),原來的Person對(duì)象并沒有被銷毀,它只是失去了引用。Java的垃圾回收機(jī)制會(huì)自動(dòng)識(shí)別無引用對(duì)象并將其回收。