Java的數據類型分爲基本數據類型和引用數據類型數組
Java 程序在運行時,須要在內存中的分配空間。爲了提升運算效率,就對空間進行了不一樣區域的劃分,由於每一片區域都有特定的處理數據方式和內存管理方式。數據結構
棧(stack):在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有 的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示overflow。所以,能從棧得到的空間較小。
堆(heep): 堆內存用來存放由new建立的對象和數組,堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。 函數
方法區:用於存放類的信息。spa
本地方法棧:給C/C++的native原生底層方法給予支持。指針
PC寄存器:給CPU用。code
堆與棧之間的聯繫:對象
當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當超過變量的做用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間能夠當即被另做他用。在堆中產生了一個數組或對象後,還能夠在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。引用變量就至關因而爲數組或對象起的一個名稱,之後就能夠在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其做用域以外後被釋放。而數組和對象自己在堆中分配, 即便程序運行到使用 new 產生數組或者對象的語句所在的代碼塊以外,數組和對象自己佔據的內存不會被釋放, 數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍然佔據內存空間不放, 在隨後的一個不肯定的時間被垃圾回收器收走(釋放掉)。
棧中的變量指向堆內存中的變量,這就是 Java 中的指針!blog
數據類型的轉換內存
數據類型的轉換分爲隱式類型轉換和顯示類型轉換,區別在於範圍大小(如int的範圍-2^16~2^16-1,注意這裏比較的並非所佔字節)的轉換方向,也就是向上轉型和向下轉型。作用域
隱式類型轉換便是向上轉型,屬於自動轉換,表示範圍小的向範圍大的數據類型進行轉換,如:
int a=50; long b=a;
顯示類型轉換便是向下轉型,屬於強制轉換,表示範圍大的向範圍小的數據類型進行轉換,如:
long a=50; int b=(int) a;