對象的內存分配
我們都知道,要使用類,就一定要爲其創建對象。那麼,在創建對象過程中,內存是如何分配的呢?
類的本質是一種引用數據類型,這與數組是一樣的。比如本文提供的簡單例子程序中的Person類,它有兩個屬性,name和age,而屬性是需要內存來存儲的。我們以person對象來講解。執行Person person=null; 時,Java系統會在棧內存開闢一個空間給對象person,程序繼續向下執行到
person=new Person(); 時,Java系統會在堆內存開闢空間保存對象person屬性(注意是屬性)的內容。person變量本身存儲的只是一個地址值,沒有存儲任何實際數據,但是它指向了Person類。所以當訪問person對象的屬性和方法時,實際上訪問的是person所引用對象的屬性和方法。
堆內存中的變量可以有多個引用,但是它們實際引用的是同一個類,如果對其中一個對象進行修改,那麼其他對象的屬性也會發生變化,因爲它們指向同一個類。
可以這麼說,對象的名稱保存在棧內存中,而對象的屬性保存在以new爲關鍵字才能開闢的堆內存中。在Java中,當爲類創建一個對象時,編譯器會爲對象的各個類型的成員變量進行初始化,無論是基本數據類型還是引用數據類型。
注意:對象在使用前一定要實例化,如果對象沒有實例化而直接使用,那麼編譯時就會出現空指針異常
本文例程代碼:
public class hello {
public static void main(String[] args) {
Person person=null;
person=new Person();
person.say();
}
}
class Person{
String name="Ters";
int age=18;
public void say() {
System.out.println(name+" "+age);
}
}
匿名對象
匿名對象
匿名對象是指沒有棧空間的對象,即沒有明確的名字給出對象。匿名對象使用的是堆內存,是通過關鍵字new進行開闢,因爲沒有對應的棧內存空間引用,所以對象只能使用一次。
new Person().say();