Java資料類型和類型轉換,java資料類型轉換
Java的資料類型分為基礎資料型別 (Elementary Data Type)和引用資料類型
Java 程式在運行時,需要在記憶體中的分配空間。為了提高運算效率,就對空間進行了不同地區的劃分,因為每一片地區都有特定的處理資料方式和記憶體管理方式。
棧(stack):在函數中定義的一些基本類型的變數和對象的引用變數都在函數的棧記憶體中分配。在Windows下,棧是向低地址擴充的資料結構,
是一塊連續的記憶體的地區。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有
的說是1M,總之是一個編譯時間就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆(heep): 堆記憶體用來存放由new建立的對象和數組,堆是向高地址擴充的資料結構,是不連續的記憶體地區。這是由於系統是用鏈表來儲存
的空閑記憶體位址的,自然是不連續的,而鏈表的遍曆方向是由低地址向高地址。堆的大小受限於電腦系統中有效虛擬記憶體。由此可見,
堆獲得的空間比較靈活,也比較大。
方法區:用於存放類的資訊。
本地方法棧:給C/C++的native原生底層方法給予支援。
PC寄存器:給CPU用。
堆與棧之間的聯絡:當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的範圍後,
Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。
在堆中產生了一個數組或對象後,還可以在棧中定義一個特殊的變數,讓棧中這個變數的取值等於
數組或對象在堆記憶體中的首地址,棧中的這個變數就成了數組或對象的引用變數。引用變數就相
當於是為數組或對象起的一個名稱,以後就可以在程式中使用棧中的引用變數來訪問堆中的數組或對象。
引用變數是普通的變數,定義時在棧中分配,引用變數在程式運行到其範圍之外後被釋放。而數組和對象本身在堆中分配,
即使程式運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身佔據的記憶體不會被釋放,
數組和對象在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍然佔據記憶體空間不放,
在隨後的一個不確定的時間被記憶體回收行程收走(釋放掉)。
棧中的變數指向堆記憶體中的變數,這就是 Java 中的指標!
資料類型的轉換
資料類型的轉換分為隱式類型轉換和顯示類型轉換,區別在於範圍大小(如int的範圍-2^16~2^16-1,注意這裡比較的並不是所佔位元組)的轉換方向,也就是向上轉型和向下轉型。
隱式類型轉換即是向上轉型,屬於自動轉換,,如:
int a=50; long b=a;
顯示類型轉換即是向下轉型,屬於強制轉換,表示範圍大的向範圍小的資料類型進行轉換,如:
long a=50; int b=(int) a;