標籤:class new 數組 控制 硬體 設計者 c++ bsp member
儘管 Java 是基於 C++ 的,但是相比之下,Java 是一種更純粹的物件導向程式設計語言。
在本章,將看到 Java 程式的基本組成部分,並體會到在 Java 中幾乎一切都是對象。
2.1 用引用操縱對象
Java 中通過引用(遙控器)操縱對象(電視機)。
引用可以獨立存在,並不一定需要有一個對象與之關聯。比如:String s; 這裡建立的只是引用,而不是對象。如果此時向 s 發送訊息,就會返回一個執行階段錯誤。因為此時 s 實際上沒有和任何事物關聯。
因此,一種安全的做法是:建立引用的同時便進行初始化,即 String s = "asdf";(這裡直接賦值了一個字串字面量,一般使用一種更通用的方式)。
2.2 必須由你建立所有對象
通常用 new 操作符建立新對象。所以,前面的例子可以寫成:String s = new String("asdf");
2.2.1 儲存到什麼地方?
- 寄存器
- 堆棧
- 儲存物件引用;JVM需要知道儲存在堆棧中的所有項的確切生命週期。
- 堆
- 存放所有的 Java 對象;編譯器不需要知道儲存在堆中的資料存活多久;效率沒有使用堆棧高。
- 常量儲存
- 非RAM儲存
2.2.2 特例:基本類型
之所以將基本類型作為特例,是因為 new 將Object Storage Service在堆中,所以用 new 建立小的、簡單的對象時,往往不是很有效。
Java 對於基本類型,不使用 new 建立變數,而是建立一個並非是引用的變數。該變數直接儲存值,共置於堆棧中,因此更加高效。
Java 中基本類型所佔儲存空間的大小不會隨機器硬體架構的變化而變化。這也是 Java 編寫的程式更具有可移植性的原因之一。
| 基本類型 |
位元位元 |
封裝器類型 |
| boolean |
|
Boolean |
| char |
16 |
Character |
| byte |
8 |
Byte |
| short |
16 |
Short |
| int |
32 |
Integer |
| long |
64 |
Long |
| float |
32 |
Float |
| double |
64 |
Double |
boolean 類型所佔儲存空間的大小沒有明確指定,僅定義為能夠取字面值 true 或 false。
JavaSE5 的自動封裝功能能夠實現基本類型和封裝器類型之間的自動轉換。
Character ch = ‘x‘;char c = ch;
Java 提供了兩個用於高精度計算的類:BigInteger 和 BigDecimal。這兩個類提供的操作與對基本類型所能執行的操作相似。只不過必須以方法調用的形式代替運算子的形式。
BigInteger 支援任意精度的整數,可以準確表示任意大小的整數值;BigDecimal 支援任何精度的定點數,可以用來進行貨幣運算。詳細使用方法查看文檔。
2.2.3 Java中的數組
Java 確保數組會被初始化,而且不能在它的範圍之外被訪問。這種範圍檢查,是以每個數組上少量的記憶體開銷以及運行時的下標檢查為代價的。換來了安全性和效率的提高。
建立一個數組對象時,實際就是建立一個引用數組,並且每個引用都會自動被初始化為一個特定值,該值有自己的關鍵字 null。一旦 Java 看到 null,就知道這個引用還沒有指向某個對象。
在使用任何引用前,必須為其指定一個對象;如果試圖使用一個為 null 的引用,運行時就會報錯。
2.3 永遠不需要銷毀對象2.3.1 範圍
大多數過程型語言都有範圍的概念。範圍決定了在其內定義的變數名的可見度和生命週期。Java 中,範圍由花括弧的位置決定。
在範圍中定義的變數,只可用於範圍結束之前。
以下代碼在 C 和 C++ 中是合法的,但 Java 中不能這麼寫:
{ int x = 1; { int x = 2; } }
Java 編譯器會報告變數 x 已經定義過。C 和 C++ 中將一個較大範圍的變數“隱藏”起來的做法,在 Java 裡是不允許的,因為 Java 設計者認為這樣會導致程式混亂。
2.3.2 對象的範圍
通過 new 建立的對象可以存活於範圍之外。如下代碼:
{ String s = new String("asdf");}
引用 s 在範圍終點就消失了。然而 s 指向的對象仍然佔據記憶體空間。在上述方法中,我們無法在這個範圍之外訪問這個對象,因為該對象的唯一引用已經超出了範圍的範圍。
所以,由 new 建立的對象,只要你需要,就會一直保留下去。這就帶來一個問題:如何防止這些對象填滿記憶體空間,進而阻塞你的程式?
Java 有一個記憶體回收行程,用來監視 new 建立的所有對象,並識別出不會再被引用的對象。隨後,釋放這些對象的記憶體空間,以便供新對象使用。
2.4 建立新的資料類型:類
大多數物件導向的程式設計語言都是用 class 關鍵字定義新的類型。格式如下:
class ATypeName { /* class body */}
建立該類型的對象:
ATypeName a = new ATypeName();
在 Java 中,你所做的全部工作就是定義類,建立這些類的對象,以及向對象發送訊息。
類有欄位和方法。欄位可以是任何類型的對象,可以通過引用與其進行通訊;也可以是基本類型中的一種。每個對象都有用來儲存其欄位的空間,普通欄位不能在對象間共用。
如何引用一個對象的成員:obj.member;嵌套情況:obj.innerObj.member;
若類的某個成員是基本類型,即使沒有進行初始化,Java 也會確保它獲得一個預設值。如下表所示:
| 基本類型 |
預設值 |
| boolean |
false |
| char |
‘\u0000‘ |
| byte |
0 |
| short |
0 |
| int |
0 |
| long |
0 |
| float |
0.0f |
| double |
0.0d |
2.5 方法、參數和傳回值
Java 的方法決定了一個對象能夠接收什麼樣的訊息。方法的基本組成包括:名稱、參數類型、傳回值和方法體。具體格式如下:
returnType methodName( /* arguments list */ ){ /* method body */}
傳回型別描述的是調用方法之後從方法返回的值。參數列表給出了要傳給方法的資訊的類型和名稱。方法名和參數列表(合稱為方法簽名)唯一的標識一個方法。
Java 中的方法只能定義在類中。
通過對象調用方法:obj.methodName( arg1,arg2,arg3)
return 關鍵字的作用:① 結束此方法;② 返回方法的結果值。
2.6 構建一個 Java 程式2.6.1 名字可見度
翻轉網域名稱,包名小寫。
2.6.2 運用其他構件
如果想在程式中使用預定義的類,那麼編譯器就必須知道如何定位這些類。如果這個類就在發出調用的那個源檔案中,就可以直接使用該類。即使這個類在檔案的後面才被定義(Java 消除了向前引用的問題)。
如果那個類位於其他檔案中,就需要通過 import 關鍵字匯入。
單獨匯入:import java.util.Date;
大量匯入:import java.util.*;
2.6.3 static 關鍵字
聲明一個事物是 static 時,意味著這個欄位或方法不會與包含它的那個類的任何對象執行個體聯絡在一起。所以,即使沒有建立某個類的任何對象,也可以調用其 static 方法或訪問其 static 欄位。
可以通過對象訪問其 static 欄位和方法,推薦使用類名直接存取。
2.7 你的第一個 Java 程式
Java編程思想 2-1 一切都是對象