日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

关于Java成员变量、局部变量、方法,在JVM的内存空间分配

發布時間:2025/3/12 java 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Java成员变量、局部变量、方法,在JVM的内存空间分配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、變量類型
2、類的結構
下面是一般類的結構

//類體=屬性+狀態(即:類體=變量+方法) public class 類名{ //類名最好首字母大寫的英文String name; //在方法體外,所以是成員變量//下面是一個main方法(程序入口的主方法)public static void main(String[] args){int i; //在main方法體內,所以是局部變量} }

3、類的編譯運行時JVM內存的變化

JVM(Java 虛擬機)主要包括三個內存空間。分別是:棧內存、堆內存、方法區內存。(堆內存和方法區內存各一個。一個線程一個棧內存)

首先類編譯后產生.class的字節碼文件,執行類加載器把.class的字節碼文件加載到方法區內存(方法的代碼片段以及整個類的代碼片段都是存儲到方法區內存當中)
找到類的程序入口(即主方法)執行到什么語句就會在對應的內存分配空間。

例如程序執行過程中使用new運算符創建的Java對象,存儲在堆內存當中。對象內部有實例變量,所以實例變量也存儲在堆內存當中。

方法調用的時候,該方法所需要的內存空間在棧內存中分配,稱為壓棧。方法執行結束后,該方法所屬的內存空間釋放,稱為彈棧。
下面分析一下案例:

public class Computer{double price; //價格String type; //型號 }public class Student{int number; //學號String name; //姓名Computer com; }public class Test{public static void main(String[] args){/* “=”符號右邊先執行 new Computer()嚴格來說是在堆內存里面開辟了一個新的Computer對象空間。 對象的空間地址給了一個名字叫computer的引用而已,引用類型就是第一個Computer。*/Computer computer=new Computer(); /* “=”符號右邊先執行 new Student()嚴格來說是在堆內存里面開辟了一個新的Student對象空間。 對象的空間地址給了一個名字叫student的引用而已,引用類型就是第一個Student。*/Student student=new Student();//student.com的引用指向了computer的引用地址(相當于將computer的引用地址給student.com的引用)student.com=computer;computer.price=4999.9;System.out.println(student.com.price); //4999.9System.out.println(student.com.type); //null,因為沒有賦值,String默認值是nullSystem.out.println(computer.price); //4999.9System.out.println(computer.type); //null,因為沒有賦值,String默認值是nullstudent.name="jack";m();System.out.println(student.number); //0,因為沒有賦值,int默認值是0System.out.println(student.name); //jack}public static void m(){String str="handsome";System.out.println("I am really "+str);}} 下面是運行結果: --------------------------------- 4999.9 null 4999.9 null I am really handsome 0 jack

以上有三個類分別是Computer類、Student類、Test類、編譯運行將產生Computer.class、Student.class、Test.class的字節碼文件。因為還用到String類,所以String.class等字節碼文件一起載入到方法區,然后找到程序入口main,方法main被壓棧。

Computer computer=new Computer(); 在堆里創建Computer 對象,實例變量有price和type,然后對象的地址0x1234給到引用computer。引用computer在main方法里面,所以引用computer在棧。Student student=new Student(); 也跟上面一樣。

student.com=computer; 是將computer的地址0x1234給到Student對象的com實例變量里。所以student.com.price是student指向的0x2451地址找到com,com指向的0x1234地址找到price;computer.price是computer指向的0x1234地址找到price;雖然結果是相同的,但是student.com.price可以體現關聯性

computer.price=4999.9; 與 student.name=“jack”;都是將地址給到對應的引用上。接下來然后遇到m();的調用,把它壓棧,方法里面的局部變量也在棧里面,方法m();執行完彈棧,跟隨的局部變量str也失效。然后執行完代碼mian方法也彈棧。(先進后出,后進先出)

擴展
  • 訪問實例變量的語法格式:
    讀取數據——>引用.變量名;修改數據——>引用.變量名=值;

  • 數據類型:
    數據類型分為基本數據類型(byte short int long float double boolean char)和引用數據類型(開發包的類(String…等)以及自己定義的類)
    數據類型的默認值

  • 三塊內存當中變化最頻繁的是棧內存,最先有數據的是方法區內存,垃圾回收器主要針對的是堆內存。

  • 垃圾回收器(自動垃圾回收機制、GC機制)什么時候會考慮將某個Java對象的內存回收呢?

問:什么時候堆內存中的Java對象會變成垃圾呢?答:沒有更多的引用指向它的時候答:這個對象無法被訪問,因為訪問對象只能提通過引用的方式訪問
  • 空引用訪問“實例“相關的數據一定會出現空指針異常。

以上是個人對JVM的理解,若有錯誤歡迎指出

總結

以上是生活随笔為你收集整理的关于Java成员变量、局部变量、方法,在JVM的内存空间分配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。