《Java程式設計邏輯》第3章 類的基礎

NelsonCheung 發表於 2020-11-22

第3章 類的基礎

3.1 類的基本概念

一種類的理解方式是函式的容器。例如在Java API的類Math,我們可以引用的方法是以public static修飾的。

static表示類方法,也叫靜態方法。與類方法相對的是例項方法,例項方法沒有static修飾,必須通過例項或物件呼叫,而類方法可以直接通過類名進行呼叫,不需要建立例項。

public表示方法是公開的,可以再任何地方被外部呼叫。

private表示方法是私有的,這個方法只能在同一個類內被別的函式呼叫,而不能被外部類呼叫。

通過private封裝和隱藏內部實現細節,避免誤操作,是計算機程式的一種基本思維方式。

以下是類Math常用的方法。

方法功能
int round(float a)
double sqrt(double a)
double ceil(double a)向上取整
double floor(double a)向下取整
double pow(double a, double b)
int abs(int a)
int max(int a, int b)
double log(double a)取自然對數
double random()產生一個 ( 0 , 1 ) (0,1) (0,1)範圍內的隨機數

以下是一個和陣列的操作相關的類Arrays常用方法。

方法功能
void sort(int[] a)按升序排序
void sort(double[] a)
int binarySearch(long[] a, long key)查詢key在陣列a中的位置
void fill(int[] a, int val)給陣列所有元素賦相同的值
int[] copyOf(int[] originnal, int newLength)陣列複製
boolean equals(char[] a1, char[] a2)判斷兩個陣列是否相同

類事實上是一種自定義的資料型別。一個型別主要由4部分組成。

  • 型別本身具有的屬性,通過類變數(static修飾,也稱靜態變數或靜態成員變數)來體現。
  • 型別本身可以進行的操作,通過類方法(static修飾,也稱靜態方法或靜態成員方法)體現。
  • 型別例項具有的屬性,通過例項變數(無static修飾,也稱成員變數)來體現。
  • 型別例項可以進行的操作,通過例項方法(無static修飾,也稱成員方法)來體現。

我們可以使用final來表示常量。

在類的定義中,類不可以使用private來修飾,但可以沒有修飾符,此時表示一種包的可見性。但在定義內部類時,可以使用private修飾符。

和類變數類似,例項變數也有publicprivate修飾符,且不能使用static修飾。

例項方法和類方法的區別如下。

  • 類方法只能訪問類變數,不能訪問例項變數,可以呼叫其他類方法,當不能呼叫本類的例項方法。
  • 例項方法既可以訪問例項變數,也可以訪問類變數。既可以呼叫類方法,也可以呼叫例項方法。

類的使用過程基本如下所示。

public class ChapterThree {
    public static void main(String[] args) {
        Point p = new Point();
        p.x = 2;
        p.y = 3;
        System.out.println(p.distance());
    }
}

其中,類的例項或物件的建立語句為Point p = new Point();。其中,new Point();是必須的。而在C++中,Point p即可建立按一個類的例項或物件。但在Java中,Point p只是建立了一個可以引用例項或物件的變數,即p的值是物件或例項的實際存放地址。此時,new Point()是為物件的例項分配記憶體,而賦值語句則把記憶體的起始地址賦值給p,使得p可以引用這個例項。

在建立物件的例項時,所有的例項變數都會分配一個預設值,其中,數值型別變數的預設值是0,boolean為false,char是“\u0000”,引用型別變數是null。null是一個特殊的值,表示這個引用型別變數不指向任何物件。

不同於C++,Java可以在定義成員變數時指定初始值,無論成員變數是否為static final

Java中的構造方法可以通過this(...)來呼叫。

每個類至少有一個構造方法,構造方法在通過new建立物件的過程中會被呼叫。如果沒有顯示定義構造方法,Java編譯器會自動生成一個預設構造方法。但顯示定義了構造方法後,Java編譯器不再生成預設構造方法。

構造方法可以使用private來修飾。

類和物件的生命週期如下。

  1. 在程式第1次通過new建立一個類的物件時,或者直接通過類名訪問類變數和類方法時,Java會將類載入進記憶體,為這個類分配一塊空間。這個空間包括類的定義、成員變數和成員方法。
  2. 類載入進記憶體後,一般不會釋放,直到程式結束。
  3. 每次做new操作時都會在記憶體中劃分一塊區域來儲存物件,每個區域都對應一個獨立的例項變數。
  4. 物件的釋放是通過Java的垃圾自動回收機制管理的,當沒有活躍變數引用物件時,物件對應的空間可能會被釋放。

物件和陣列一樣,有兩塊記憶體,儲存地址的部分分配在棧中,儲存實際內容的部分分配在堆中。

3.2 類的組合

3.3 程式碼的組織機制