1. 程式人生 > >淺談new物件並給屬性賦值,呼叫方法的記憶體機制

淺談new物件並給屬性賦值,呼叫方法的記憶體機制

下面來看一段新建物件的簡單程式碼:

public class Student {

    String name;

    int age ;

    public void play   (){

        System.out.print(name+"在玩耍")

}

    public void print(String sname){

        System.out.print(name+"在和"+sname+"玩耍")

}

    public static void main(String []args){

    //新建物件s1,s2,並給屬性方法賦值

        Student s1=new Student();

        s1.name="老王";

        s1.age=18;

        s1.play();

        s1.print("老張");

        Student s2=new Student();

        s2.name="王老五";

        s2.age=28;

        s2.play();

        s2.print("張三丰");

    }

}

那麼java虛擬機器裡具體是如何並按什麼順序操作的呢?

首先我們來談談java虛擬機器中 棧、堆、方法區分別存放的內容。

棧:用來存放區域性變數

堆:存放new出來的物件

方法區:存放類的資訊(程式碼)、static變數、常量池(字串常量)等。

三者具體的關係本次就不詳細講了,有興趣的可以看下 深入瞭解jvm虛擬機器這本書。

main方法下面第一句

 Student s1=new Student();

第一步  :通過類載入器class load載入Student類,在方法區中就有了Student類的資訊


第二步 建立s1變數


第三步 new一個s1物件,並將堆中s1物件的地址傳給棧中變數s1


main下第二到第五句

         s1.name="老王";

        s1.age=18;

        s1.play();

        s1.print("老張");

第四步 name、age賦值 :name屬於字串,不能直接賦值需要引用字串池裡的"老王"所對應的地址

            age屬於基本資料型別,不需要引用地址,直接賦值

第五步 呼叫方法play()、print(0:堆中s1引用方法區 paly()、print()的地址

其中print(sname)中的引數通過棧幀從字串池傳到s1方法中。本次不詳細討論,有興趣的同學可以查相關資料。


第六步 同S1不詳細討論,注:因為s1已經將Student類資訊匯入,s2新建物件時不需要再重新匯入

         Student s2=new Student();

        s2.name="王老五";

        s2.age=28;

        s2.play();

        s2.print("張三丰");

最後的記憶體圖