1.java數據類型分類 Java語言是強類型(Strongly typed)語言,強類型包含兩方面的含義:①所有的變數必須先聲明,後使用;②指定類型的變數只能接受類型與之匹配的值。這意味著每個變數和每個表達式都有一個在編譯時就確定的類型。 Java語言支持的類型有兩類:基本類型(Primitive ...
1.java數據類型分類
Java語言是強類型(Strongly typed)語言,強類型包含兩方面的含義:①所有的變數必須先聲明,後使用;②指定類型的變數只能接受類型與之匹配的值。這意味著每個變數和每個表達式都有一個在編譯時就確定的類型。
Java語言支持的類型有兩類:基本類型(Primitive Type)和引用類型(Reference Type)。基本類型包括boolean類型和數值類型。數值類型有整數類型和浮點類型。整數類型包括byte、short、int、long、char,浮點類型包括float和double。引用類型包括類,介面和數組類型,還有一種特殊的null類型。所謂引用類型就是對一個對象的引用,對象包括實例和數組兩種。實際上引用類型變數就是一個指針,只是java語言不在使用指針這個說法。空類型(null type)就是null值的類型,這種類型沒有名稱,所以不可能聲明一個null類型的變數或者轉換到null類型。空引用(null)是null類型變數唯一的值。空引用可以轉換為任何引用類型。在實際開發中,程式員可以忽略null類型,假定null只是引用類型的一個特殊直接量。(註:空引用null只能被轉換為引用類型,不能轉換為基本類型,因此不要把null賦給一個基本類型的變數)
聲明變數的語法:type varName[=初始值];
2.java不同數據類型在JVM中記憶體的存放位置
變數在JVM中記憶體的分配主要取決於變數的作用範圍與變數的數據類型。
基本數據類型是放在棧中還是放在堆中,這取決於基本類型在何處聲明,下麵對數據類型在記憶體中的存儲問題來解釋一下:
2.1.在方法中聲明的變數,即該變數是局部變數,每當程式調用方法時,系統都會為該方法建立一個方法棧,其所在方法中聲明的變數就放在方法棧中,當方法結束系統會釋放方法棧,其對應在該方法中聲明的變數隨著棧的銷毀而結束,這就局部變數只能在方法中有效的原因。在方法中聲明的變數可以是基本類型的變數,也可以是引用類型的變數。
(1)當聲明是基本類型的變數的時,其變數名及值(變數名及值是兩個概念)是放在JAVA虛擬機棧中
(2)當聲明的是引用變數時,所聲明的變數(該變數實際上是在方法中存儲的是記憶體地址值)是放在JAVA虛擬機的棧中,該變數所指向的對象是放在堆類存中的。
2.2.在類中聲明的變數是成員變數,也叫全局變數,放在堆中的(因為全局變數不會隨著某個方法執行結束而銷毀)。
同樣在類中聲明的變數即可是基本類型的變數 也可是引用類型的變數
(1)當聲明的是基本類型的變數其變數名及其值放在堆記憶體中的
(2)引用類型時,其聲明的變數仍然會存儲一個記憶體地址值,該記憶體地址值指向所引用的對象。引用變數名和對應的對象仍然存儲在相應的堆中。
3.Java不同數據類型在JVM中何時分配記憶體
3.1.成員變數:
當系統載入類或創建類的實例時,系統會自動為成員變數分配記憶體空間,併在分配記憶體空間後自動為成員變數指定初始值。基本數據類型預設初始值是0,引用數據類型預設初始值是null。
3.2.局部變數:
局部變數定義後,必須經過顯示初始化後才能使用。這意味著定義了局部變數後,系統並未為這個變數分配記憶體空間,直到等到程式為這個變數賦值初始值時,系統才會給局部變數分配記憶體,並將初始值保存在這塊記憶體中。
與成員變數不同,局部變數不屬於任何類或實例,因此它總是保存在其所在方法的棧記憶體中。如果局部變數時基本類型變數,則直接把變數值存在棧中,如果是引用類型,則存放地址在棧中。
棧記憶體中的變數無須系統垃圾回收,變數是隨方法或代碼塊的運行結束而結束的。因此,局部變數的作用域是從初始化該變數開始,直到該方法或該代碼塊運行完成而結束。因為局部變數只保存基本類型的值或對象的引用,因此局部變數所占的記憶體通常較小。
當我們定義一個成員變數時,成員變數將被放置到堆記憶體中,成員變數的作用域將擴大到類存在範圍或者對象存在範圍。這種範圍擴大有兩個壞處:
①增大了變數的生存時間,將導致更大的系統開銷
②擴大了作用域,不利於程式的內聚性。