標籤:程式碼 入口 color 匯入 編譯 告訴 data 方法 編程錯誤
一切都是對象
歡迎轉載。轉載請標明出處:http://blog.csdn.net/notbaron/article/details/51040221
雖然以C++為基礎,但 Java 是一種更純粹的物件導向程式設計語言
正式用它設計之前,必須先將自己的思想轉入一個物件導向的世界
1 用控制代碼操縱對象
在 Java 裡,不論什麼東西都可看作對象。可採用一種統一的文法。不論什麼地方均可照搬不誤。注意,雖然將一切都“看作”對象,但操縱的標識符實際是指向一個對象的“控制代碼”(Handle)。
2 全部對象都必須建立
建立控制代碼時,希望同一個新對象串連。
通經常使用 newkeyword達到這一目的。
程式執行時,特別要注意的是記憶體的分配。
有六個地方都能夠儲存資料
2.1 寄存器
這是最快的儲存地區。由於它位於和其它全部儲存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是依據須要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程式裡找到寄存器存在的不論什麼蹤跡。
2.2 堆棧
駐留於常規 RAM(隨機訪問儲存空間)地區。但可通過它的“堆棧指標”獲得處理的直接支援。
堆棧指標若向下移,會建立新的記憶體;若向上移,則會釋放那些記憶體。這是一種特別快、特別有效資料儲存方式,僅次於寄存器。建立程式時,Java 編譯器必須準確地知道堆棧內儲存的全部資料的“長度”以及“存在時間”。這是因為它必鬚生成對應的代碼,以便向上和向下移動指標。
這一限制無疑影響了程式的靈活性,所以雖然有些Java 資料要儲存在堆棧裡——特別是物件控點,但Java 對象並不放到當中。
2.3 堆
一種常規用途的記憶體池(也在 RAM地區)。當中儲存了Java 對象。和堆棧不同。“記憶體堆”或“堆”(Heap)最迷人的地方在於編譯器不必知道要從堆裡分配多少儲存空間,也不必知道儲存的資料要在堆裡停留多長的時間。
因此,用堆儲存資料時會得到更大的靈活性。要求建立一個對象時,僅僅需用new命令編製相關的代碼就可以。運行這些代碼時,會在堆裡自己主動進行資料的儲存。
必定會付出一定的代價:在堆裡分配儲存空間時會花掉更長的時間!
2.4 靜態儲存
“靜態”(Static)是指“位於固定位置”(也在RAM裡)。
程式執行期間。靜態儲存的資料將隨時等候調用。可用static keyword指出一個對象的特定元素是靜態。但 Java 對象本身永遠都不會置入靜態儲存空間。
2.5 常數儲存
常數值通常直接置於程式碼內部。
它們永遠都不會改變。
有的常數須要嚴格地保護。所以可考慮將它們置入僅僅讀儲存空間(ROM)。
2.6 非RAM 儲存
若資料全然獨立於一個程式之外。則程式不執行時仍可存在,並在程式的控制範圍之外。
當中兩個最基本的範例便是“流式對象”和“固定對象”。對於流式對象,對象會變成位元組流,一般會發給還有一台機器。而對於固定對象。對象儲存在磁碟中。即使程式中止執行。它們仍可保持自己的狀態不變。對於這些類型的資料存放區,一個特別實用的技巧就是它們能存在於其它媒體中。一旦須要,甚至能將它們恢複成普通的、基於RAM的對象。
2.6.1 主要類型
有一系列類需特別對待;可將它們想象成“基本”、“主要”或者“主”(Primitive)類型,進行程式設計時要頻繁用到它們。
2.6.2 Java 的數組
差點兒全部程式設計語言都支援數組。
在C和C++裡使用數組是很危急的,由於那些數組僅僅是記憶體塊。若程式訪問自己記憶體塊以外的數組,或者在初始化之前使用記憶體(屬於常規編程錯誤),會產生不可預測的後果。在C++裡。應盡量不要使用數組,換用標準模板庫(Standard TemplateLibrary)裡更安全的容器。
Java 的一項主要設計目標就是安全性。所以在C 和C++裡困擾程式猿的很多問題都未在Java 裡反覆。一個Java 能夠保證被初始化。並且不可在它的範圍之外訪問。
因為系統自己主動進行範圍檢查。所以必定要付出一些代價:針對每一個數組。以及在執行期間對索引的校正,都會造成少量的記憶體開銷。
換回的是更高的安全性,以及更高的工作效率。為此付出少許代價是值得的。
2.7 不要清除對象
在大多數程式設計語言中,變數的“存在時間”(Lifetime)一直是程式猿須要著重考慮的問題。
大多數程式設計語言都提供了“範圍”(Scope)的概念。
對於在範圍裡定義的名字。範圍同一時候決定了它的“可見度”以及“存在時間”。
Java 對象不具備與主類型一樣的存在時間。用new keyword建立一個Java 對象的時候,它會超出範圍的範圍之外。
在 C++裡。一旦工作完畢,必須保證將對象清除。
Java 有一個特別的“垃圾收集器”,它會尋找用new建立的全部對象,並辨別當中哪些不再被引用。
隨後。它會自己主動釋放由那些閑置對象佔領的記憶體。以便能由新對象使用。這意味著我們根本不必擔心記憶體的回收問題。僅僅需簡單地建立對象,一旦不再須要它們,它們就會自己主動離去。這樣做可防止在C++裡非經常見的一個編程問題:因為程式猿忘記釋放記憶體造成的“記憶體溢出”。
2.8 資料類型:類
但從曆史看來,大多數物件導向的語言都用keyword“class”表達這樣一個意思:“我準備告訴你對象一種新類型的外觀”。在這個keyword的後面。應該尾隨新資料類型的名稱。
比如:
class ATypeName{/*類主體置於這裡}
這樣就引入了一種新類型,接下來便可用new 建立這樣的類型的一個新對象:
ATypeName a =new ATypeName();
在ATypeName 裡,類主體僅僅由一條凝視構成(星號和斜杠以及當中的內容。本章後面還會具體講述),所以並不能對它做太多的事情。其實。除非為其定義了某些方法。否則根本不能指示它做不論什麼事情。
2.8.1 欄位和方法
可在自己的類裡設定兩種類型的元素:資料成員(有時也叫“欄位”)以及成員函數(通常叫“方法”)
資料成員是一種對象(通過它的控制代碼與其通訊),能夠為不論什麼類型。它也能夠是主類型(並非控制代碼)之中的一個。
假設是指向對象的一個控制代碼,則必須初始化那個控制代碼,用一種名為“構建器”(的特殊函數將其與一個實際對象串連起來(就象使用newkeyword)。
但若是一種主類型,則可在類定義位置直接初始化(正如後面會看到的那樣,控制代碼亦可在定義位置初始化)。
每一個對象都為自己的資料成員保有儲存空間;資料成員不會在對象之間共用。
一旦將變數作為類成員使用。就要特別注意由 Java 分配的預設值。
這樣做可保證主類型的成員變數肯定得到了初始化(C++不具備這一功能)。可有效遏止多種相關的編程錯誤。
2.9 方法、自變數和返回值
JAVA用方法來替代 函數的叫法。
傳回型別是指調用方法之後返回的數值類型。顯然,方法名的作用是對詳細的方法進行標識和引用。自變數列表列出了想傳遞給方法的資訊類型和名稱。
Java 的方法僅僅能作為類的一部分建立。僅僅能針對某個對象調用一個方法,並且那個對象必須可以運行那個方法調用。若試圖為一個對象調用錯誤的方法。就會在編譯期得到一條出錯訊息。
為一個對象調用方法時,須要先列出對象的名字。在後面跟上一個句點,再跟上方法名以及它的參數列表。即“對象名.方法名(自變數1,自變數2,自變數3...)。
如果我們有一個方法名叫f(),它沒有自變數,返回的是類型為int的一個值。那麼,如果有一個名為 a 的對象,可為其調用方法f(),則代碼例如以下:
int x = a.f();
返回值的類型必須相容 x的類型。
象這樣調用一個方法的行動通常叫作“向對象發送一條訊息”。
在上面的範例中,訊息是f(),而對象是 a。
物件導向的程式設計通常簡單地歸納為“向對象發送訊息”。
在上面的範例中,訊息是f()。而對象是 a。物件導向的程式設計通常簡單地歸納為“向對象發送訊息”。
2.9.1 自變數列表
自變數列表規定了我們傳送給方法的是什麼資訊。
採用的都是對象的形式。我們必須在自變數列表裡指定要傳遞的物件類型,以及每一個對象的名字。
正如在Java 其它地方處理對象時一樣。我們實際傳遞的是“控制代碼”。倘若希望自變數是一個“字串”,那麼傳遞的必須是一個字串。
一個程式僅僅是一系列對象的集合,它們的方法將其它對象作為自己的自變數使用。並且將訊息發給那些對象。
2.10 構建JAVA程式2.10.1 名字可見
在全部程式設計語言裡,一個不可避免的問題是對名字或名稱的控制。
怎樣區分兩個名字,並防止兩個名字互相衝突呢?C++用額外的keyword引入了“命名空間”的概念。Java為了給一個庫產生明白的名字。採用了與Internet網域名稱類似的名字。所以能全然避免這些問題。
2.10.2 使用其它組件
一旦要在自己的程式裡使用一個預先定義好的類。編譯器就必須知道怎樣找到它。
import的作用是指示編譯器匯入一個“包”——或者說一個“類庫”(Java 的全部代碼都必須寫入一個類中)。
大多數時候。直接採用來自標準Java 庫的組件(組件)就可以,它們是與編譯器配套提供的。
使用這些組件時,沒有必要關心冗長的保留網域名
2.10.3 static keyword
除非用new 建立那個類的一個對象,否則實際上並未得到不論什麼東西。僅僅有運行了new 後,才會正式產生資料存放區空間,並可使用對應的方法。
在兩種特殊的情形下,上述方法並不堪用。一種情形是僅僅想用一個儲存地區來儲存一個特定的資料——不管要建立多少個對象。甚至根本不建立對象。
還有一種情形是我們須要一個特殊的方法,它沒有與這個類的不論什麼對象關聯。也就是說,即使沒有建立對象,也須要一個能調用的方法。為滿足這雙方面的要求。可使用static(靜態)keyword。
一旦將什麼東西設為static,資料或方法就不會同那個類的不論什麼對象執行個體聯絡到一起。所以雖然從未建立那個類的一個對象,仍能調用一個 static方法,或訪問一些 static資料。
對於非 static資料和方法,我們必須建立一個對象,並用那個對象訪問資料或方法。這是因為非static資料和方法必須知道它們操作的詳細對象。當然,在正式使用前,因為static方法不須要建立不論什麼對象。所以它們不可簡單地調用其它那些成員,同一時候不引用一個已命名的對象,從而直接訪問非 static成員或方法(因為非static成員和方法必須同一個特定的對象關聯到一起)。
有些物件導向的語言使用了“類資料”和“類方法”這兩個術語。
它們意味著資料和方法僅僅是為作為一個總體的類而存在的,並非為那個類的不論什麼特定對象。
static一項重要的用途就是協助我們在不必建立對象的前提下調用那個方法。
正如以後會看到的那樣,這一點是至關重要的——特別是在定義程式執行入口方法main()的時候。
和其它不論什麼方法一樣,static方法也能建立自己類型的命名物件。
所以常常把static方法作為一個“領頭羊”使用,用它產生一系列自己類型的“執行個體”.
2.JAVA編程思想——一切都是對象