java編程思想(2)--一切都是對象
1創建對象
String s ;創建引用,並未初始化,即引用未關聯任何東西
String s2="asda"; 初始化
System.out.println(s2);
System.out.println(s);//報錯
用new 來初始化
String s = new String("sgjadfjaf");
1.1如何存儲
程序運行時,對象時怎麽放置安排的呢?內存怎麽分配的呢?
(1)寄存器
--處理器內部,外部程序感覺不到其存在
(2)堆棧
--位於RAM(隨機訪問存儲器中),通過堆棧指針可以從處理器那裏獲得直接支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。java系統必須知道存放在堆棧上所有對象的確切生命周期,以便上下移動堆棧指針,但這一約束限制了程序的靈活性,所以最燃某些java數據存儲在堆棧中--特別是對象引用,但是java對象並不存在其中。
(3)堆
一種通用的內存池(也位於RAM中),用於存放所有的java對象。堆不同與堆棧的好處是:編譯器不需要知道存儲的數據在堆棧裏存活多長時間。因此在堆裏分配時有很大的靈活性。當需要一個對象時,只要new一下,當執行到new時,會自動在堆裏進行存儲分配。當然,這種靈活性也要付出相應的代價;用堆進行存儲分配和清理可能比用堆棧進行存儲分配需要更多的時間。
(4)常量對象
常量值通常直接存放在程序代碼內部,這樣做是安全的,因為他們永遠不會被改變。有時,在嵌入式系統中,常量本身會和其他部分割離開,這種情況下可以存放在只讀存儲器ROM中。
(5)非RAM存儲
如果數據完全存活在程序之外,那麽它可以完全不受程序的任何控制,在程序沒有運行時也可以存在。其中兩個基本的例子是 流對象和持久化對象。在流對象中,對象轉化成字節流,通常被發送給另一臺機器。在“持久化對象”中,對象被存放於磁盤上,因此即使程序被終止,他們仍能保持自己的狀態。這種存儲的技巧在於:把對象轉化成可以存放在其他媒介上的事物,在需要時,可以恢復成常規的、基於RAM的對象。java提供了對輕量級持久化的支持,而存儲JDBC和hibernate這樣的機制提供了更加復雜的對在數據數據庫中存儲和讀取對象信息的支持。
1.2 特例:基本類型
在程序設計時經常使用到一系列基本類型,他們需要特殊對待,因為new將對象存儲在“堆”裏,故用new創建一個對象--特別是小的、簡單的變量,往往不是很有效。java對於這種類型不用new 來創建變量,而是創建一個並非是引用的“自動”變量、這個變量是直接存儲“值”,並置於堆棧中,因此更加高效。
序號 |
數據類型 |
位數 |
默認值 |
取值範圍 |
包裝器類型 |
1 | byte(位) | 8 | 0 | -2^7 - 2^7-1 | Byte |
2 | short(短整數) | 16 | 0 | -2^15 - 2^15-1 | Short |
3 | int(整數) | 32 | 0 | -2^31 - 2^31-1 | Integer |
4 | long(長整數) | 64 | 0 | -2^63 - 2^63-1 | Long |
5 | float(單精度) | 32 | 0.0 | -2^31 - 2^31-1 | Float |
6 | double(雙精度) | 64 | 0.0 | -2^63 - 2^63-1 | Double |
7 | char(字符) | 16 | 空 | 0 - 2^16-1 | Character |
8 | boolean(布爾值) | 8 | false | true、false |
Boolean |
9 void Void
JAVA提供 了自動拆裝箱的功能
高精度數字
java提供了兩個高精度計算的類:BigInteger 和 BigDecimal,它們大體屬於包裝器的範疇,但是卻沒對應的基本類型。
這兩個類以方法調用的方式取代運算符方式來實現運算,所以速度會比較慢,但是以速度換取了精度
BigInteger 支持任意精度的整數,可以表示任意大小的整數值,而不損失精度。
BigDecimal 支持任意精度的定點數,可以進行精確地貨幣計算
1.3java中的數組
java會確保數組被初始化,而且不能被他的範圍之外訪問。這種範圍檢查是以每個數組上少量的內存開銷及運行時的下標檢查為代價的,因此換來了安全性和效率的提升。
當創建一個數組對象時,實際上就是創建了一個引用數組,並且每個引用都會自動被初始化一個特定值,該值擁有自己的關鍵字null.一旦java看見null,就知道這個引用還未指向某個對象,運行時就會報錯。
2.永遠不需要銷毀對象
2.1 作用域
{
}
2.2對象的作用域
java對象的作用域不具備和基本類型一樣的生命周期。new一個java對象時,它可以存活作用域之外。
{
String s = new String(" a String");
}//end of Scope
引用s在作用域終點就消失了。然而s指向的String對象繼續占用著內存空間。java通過垃圾回收器完成對不在引用的對象的回收,釋放內存空間。
2.3創建類
class
字段和方法
方法、參數和返回值、參數列表
2.4 static關鍵字
static關鍵字解決了,一種情形是,只想為某特定域分配單一存儲空間,而不去考慮究竟要創建多少對象,甚至不需要創建對象。另一種情形是,希望某個方法不與包含它的類的任何對象關聯在一起,即使沒有創建對象,也能夠調用這個方法。
當聲明一個事務是static時,就意味著這個域或者方法不會與包含它的那個類的任何對象實例關聯在一起。所以,即使從未創建某個類對象,也可以調用它。
盡管當static作用於某個字段時,肯定會改變數據創建的方式(因為一個static字段對每個類來說都只有一份存儲空間,而非static字段則是對每個對象有一個存儲空間),但是如果static作用域某個方法,差別卻沒有那麽大。static方法的一個重要用法就是在不創建任何對象的前提下就可以調用它,正如我們所看到的那樣,這一點對main()方法很重要,這個方法是運行一個應用的入口點。
和其他任何方法一樣,static方法可以創建或使用與其類型相同的被命名對象,因此,static方法常常拿來做“牧羊人”的角色,負責看護與其隸屬同一類型的實例群。
java編程思想(2)--一切都是對象