1、對象
java最流行的一句話就是“萬物皆對象”。要理解對象,直接舉個栗子,人,是一個類,單個的人比如“小明”,就是一個對象,也叫做人類的一個實例。
2、對象引用
先看一段我們經常用作創建一個對象的代碼:
Student stu = new Student();
這里,有人會說,stu是一個對象,是Student類的一個實例。也有人會說,這里的stu並不是一個真正的實例,而是一個指向所創建對象的引用。到底是怎么回事呢?先別着急下結論,先看下面的代碼
Student stu; stu = new Student();
這段代碼跟上面的代碼效果是一樣的吧,這個不用多說。看到這里,應該已經有人明白了上面的問題的結論。
大家知道,new是java用來在堆上創建對象的,如果stu是一個對象的話,那為什么第二句還要用new去創建對象呢?所以,顯然stu是一個對象的引用,new Student()才是真正的對象,stu知識一個指向Student類所創建的對象的引用。
3、引用變量
有了上面的栗子,大家應該引用變量是啥了吧。
Student stu;//stu就是引用變量
4、對象與對象引用
下面再來看一段代碼
Person person; person = new Person(); //person對象引用指向一個對象 person = new String(); //person對象指向另一個對象
這段代碼是什么結果呢?,第三行會報錯。這就說明,一個對象的引用,要么不指向任何對象,要么只能指向一個對象,再多了就回報錯。
那么再看一段代碼
public static void main(String[] args) { String str; //定義一個引用對象,指向零個對象 str=new String("string1"); //一個對象引用str指向一個對象string1 str=new String("string2");//注意:這里對象引用str並不是指向第二個對象string2,而是將之前指向第一個對象string1的引用重新指向了另一個對象string2 System.out.println(str); } 運行結果: string2
這個結果應該能夠接受吧。String對象引用str被new了兩次,也就是產生了2個對象,這個程序居然不報錯。對象引用str並不是指向第二個對象string2,而是將之前指向第一個對象string1的引用重新指向了另一個對象string2,因此從對象引用出發:一個對象引用可以指向零個或一個對象!
最后,在java虛擬機中,對象的引用是存在棧中的,而對象是存放在堆中的。