一切都是對象---JAVA編程思想

一切都是對象

“如果我們說另一種不同的語言,那麼我們就會發覺一個有些不同的世界。”——Luduing Wittgerstein(1889-1951)

儘管Java是基於C++的,但是相比之下,Java是一種更“純粹”的面向對象設計語言。

Java語言假設我們只進行面向對象的程序設計;而C++不同,因爲C++是C的一個超集,所以,C++在某些方面顯得過於複雜。


2.1 用引用操縱對象

程序員必須注意將要處理的數據是什麼類型。你是直接操縱元素,還是用某種基於特殊語法的間接表示(例如C和C++這裏的指針)來操作對象?

這一切在Java裏都得到了簡化。一切都被視爲對象,因此可採用單一固定的語法。儘管一切都看做對象,但操縱的標識符實際上是對象的一個“引用”。形如:String s中的s就是引用。


2.2 必須由你創建所有對象

一旦創建了一個引用,就希望它能與一個新的對象相關聯。通常用new操作符來實現這一目的。形如:String s = new String("");這種形式。

程序運行時,對象是怎麼進行放置安排的呢?特別是內存是怎樣分配的呢?

有五種不同的地方可以存儲數據:

  1. 寄存器。這是最快的存儲區,因爲它位於不同於其他存儲區的地方——處理器內部。但是寄存器的數量及其有限,所以寄存器根據需求進行分配。你不能直接控制,也不能再程序中感覺到寄存器存在的任何跡象(C和C++允許你向編譯器建議寄存器的分配方式)。
  2. 堆棧位於通用RAM(隨機訪問存儲器)中,但通過堆棧指針可以從處理器那裏獲得直接支持。堆棧指針向下移動,則分配新內存;向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次於寄存器。創建程序時,Java系統必須知道存儲在堆棧內所有項的確切生命週期,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些Java數據存儲在堆棧中——特別是對象引用,但是Java對象並不存儲在其中
  3. 。一種通用的內存池(也位於RAM區),用於存放所有的Java對象。堆不同於堆棧的好處是:編譯器不需要知道存儲的數據在堆裏存活多長時間。因此,在堆裏分配內存有很大的靈活性。當需要一個對象時,只需用new寫一行簡單的代碼,當執行這行代碼時,會自動在堆裏進行存儲分配。當然,爲這種靈活性必須要付出相應的代價:用堆進行存儲分配和清理可能比用堆棧進行存儲分配需要更多時間(如果確實可以在Java中像C++中一樣在棧中創建對象,言外之意是說Java沒有像C++一樣在棧中創建對象的本事。當然,基本類型可以在棧中創建)。
  4. 常量存儲常量值通常直接存放在程序代碼內部,這樣做是安全的,因爲它們永遠不會改變。有時,在嵌入式系統中,常量本身會和其他部分離開,所以在這種情況下,可以選擇將其放在ROM(只讀存儲器)中。
  5. 非RAM存儲。如果數據完全存活於程序之外,那麼它可以不受程序的任何控制,在程序沒有運行時也可以存在。其中兩個基本的例子就是流對象持久化對象。在流對象中,對象轉化成字節流,通常被髮送給另一臺機器。在持久化對象中,對象被存放在磁盤上,因此,即使程序終止,它們仍可以保持自己的狀態。這種存儲方式的技巧在於;把對象轉化成可以存放在其他媒介上的事物,在需要時,可恢復成常規的、基於RAM的對象Java提供了對輕量級持久化的支持,而諸如JDBC和Hibernate這樣的機制提供了更加複雜的對在數據庫中存儲和讀取對象信息的支持。

以上都在說“引用”對象,我們看一個特例:基本類型

爲什麼要存在基本類型呢?

因爲new將對象存儲在“堆”裏,用new創建一個小的、簡單的變量,往往不是很有效。因此,對於這些類型,Java採用與C和C++相同的方法。也就是說,不用new來創建變量,而是創建一個並非是引用的“自動”變量。這個變量直接存儲“值”,並置於堆棧中,因此更加高效

Java的基本數據類型所佔存儲空間的大小:
這裏寫圖片描述

這裏指出:Boolean只有true或flase,以及Java SE5的自動包裝,還有高精度數字BigInteger和BigDecimal的類型

BigInteger支持任意精度的整數。

BigDecimal支持任何進度的定點數。

Java中的數組
幾乎所有的程序都支持數組。在C和C++中使用數組是危險的,因爲C和C++中的數組就是內存塊。如果一個程序要訪問其自身內存塊之外的數組,或在數組初始化前使用內存(程序中常見的錯誤),都會產生難以預料的後果(改天可以試試,嘿嘿)。

Java的主要目標之一是安全性。Java會確保數組被初始化,並且會檢查數組下標是否越界。雖然這種範圍檢查是以每個數組上少量的內存開銷及運行時的下標檢查爲代價的。但換來的是安全性和效率的提高,因此付出的代價是值得的。

創建一個數組對象時,實際上就是創建了一個引用數組,並且每個引用都會自動的被初始化爲一個特定值null


2.3 永遠不需要銷燬對象

大多數程序設計語言中,變量生命週期的概念,佔據了程序設計工作中非常重要的部分。

作用域,大多數過程語言都有作用域(scope)的概念。作用域決定了在其內定義的變量名的可見性和生命週期。在C、C++和Java中,作用域由花括號的位置決定。

對象的作用域,Java對象不具備和基本類型一樣的生命週期。當用new創建一個Java對象時,它可以存活於作用域之外。如下:

{
    String s = new String("");
}

引用s在作用域終點就消失了。然而,s指向的String對象仍繼續佔據內存空間。

事實證明,由new創建的對象,只要你需要,就會一直保留下去。這樣,許多C++編程問題在Java中就完全消失了。在C++中,你不僅必須要確保對象的保留時間與你需要這些對象的時間一樣長,而且還必須在你使用完它們之後,將其銷燬。

不過這樣就帶來了一個問題。靠什麼才能防止這些對象填滿內存空間,進而阻塞你的程序呢?沒錯,就是我們的垃圾回收器,它用來釋放那些不會再被引用的對象,將內存空間提供給新的對象使用。


2.4 創建新的數據類型:類

用class這個關鍵字,有方法和字段。不做闡述!!

注意:局部變量沒有默認初始化(也就是方法內的變量),成員變量(也就是字段)有默認初始化。


2.5 方法、參數和返回值

調用方法,通常被稱爲發送消息給對象

參數列表和返回值,不做闡述!


2.6 構建一個Java程序

名字可見性,Java採用一種全新的方法來避免類名或者函數名互相沖突。就是增加一個包名(package關鍵字),一般我們將包名設爲我們的域名,如(com.baidu.www,是反着寫)(因爲域名是唯一的)。

運用其他構件,我需要引入別人的庫?那就需要用到import 你需要引入庫的包名(例如,import java.util.*)。

static關鍵字,有些面嚮對象語言採用類數據類方法。類數據和類方法是作爲整個類存在的,而不是類的某個特定對象存在的(類與對象都直接使用靜態成員和靜態方法)


2.9 編碼風格

“駝峯風格”,類名的首字母大寫;如果類名由幾個單詞構成,那麼把它們連在一起並且每個單詞首字母大寫。字段名與類名相似,除了第一個單詞的首字母不大寫以外,其他都單詞首字母都大寫。


本章完

發佈了68 篇原創文章 · 獲贊 24 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章