跳轉到內容

入門

100% developed
來自華夏公益教科書

瀏覽 入門 主題: v  d  e )


理解系統

[編輯 | 編輯原始碼]

我們用系統的概念來理解周圍的世界。一個 **系統** 是一個相互連線的物件網路,它們協同工作。在 系統論 中,系統被設定為一個單一實體,位於被環境包圍的世界中。系統透過兩種不同型別的訊息與其周圍環境互動

  • **輸入:** 從周圍環境接收的訊息;以及,
  • **輸出:** 發回給周圍環境的訊息。


**圖 1:** 一個簡單的系統透過輸入和輸出訊息與其環境互動。


生命是一個複雜而混亂的相互連線的物件網路,它們傳送訊號和訊息。請參閱下圖 2 中展示的單個公司的經濟生態系統的複雜系統示例。想象一下,如果你要新增更多公司及其子系統,這個系統圖會是什麼樣子。一般來說,計算機軟體系統是一個更復雜的相互連線的 **子系統** 網路——其中每個子系統可能被進一步劃分為子系統,也可能不被劃分。每個子系統都使用 **反饋** 訊息(即 *輸入* 和 *輸出*)與其他系統通訊。


**圖 2:** 具有多個子系統和互動的複雜系統的示例


抽象過程

[編輯 | 編輯原始碼]

程式設計本質上是將現實生活中問題的解決方案視為一個系統。對於任何程式語言,您都需要了解如何將現實生活中的問題轉化為能夠在計算機系統中準確表示的內容。為了開始使用 Java 程式語言進行程式設計(或者實際上,使用任何程式語言),程式設計師首先必須瞭解抽象的基礎知識。

**抽象** 是將現實生活中的問題和物件 *表示* 到程式中的過程。

假設一位小說家、一位畫家和一位程式設計師被要求在其作品中 *抽象*(即 *表示*)一個現實生活中的物件。假設需要抽象的現實生活物件是 *動物*。對於小說家來說,抽象包括寫出動物的描述,而畫家則會畫出動物的圖片——那麼計算機程式設計師呢?

Java 程式語言使用一種稱為 面向物件程式設計 (OOP) 的程式設計正規化,它向您展示了程式設計師需要做什麼。根據 OOP,現實生活中每個物件或問題都可以轉化為計算機系統中的虛擬物件。

以物件思維

[編輯 | 編輯原始碼]

在 OOP 中,現實生活中每個物件的抽象在您的程式碼中被稱為 **物件**。物件本質上是現實生活中的物件的計算機系統中最基本表示。由於 Java 是一種面向物件的語言,Java 中的一切都表示為物件。為了演示這種效果,如果您要定義動物的抽象,您將編寫以下幾行程式碼(就像您對任何其他抽象所做的那樣)


Computer code
class Animal { }


上面的程式碼在您的程式碼中建立一個空間,您可以在其中開始 *定義* 物件;這個空間被稱為 **類(或型別)定義**。所有物件都需要使用類定義來定義,才能在您的程式中使用它們。請注意花括號——您在這些括號中編寫的任何內容都將用作物件的定義或規範。在上面的例子中,我們建立了一個名為 Animal 的類定義,用於表示現實生活中任何動物的抽象表示。Java 環境將此程式碼評估為類定義的方式是透過檢視我們用於開始類定義的字首詞(即 class)。Java 語言中的這種預定義詞被稱為 **關鍵字**,它們構成了該語言的語法(稱為 **程式設計語法**)。

注意
類定義在不同的語言中具有不同的名稱。它們有時也被稱為 **型別定義**、**物件規範** 或 **模板**

理解類定義和型別

[編輯 | 編輯原始碼]

亞里士多德 也許是第一個思考抽象型別或物件型別學的人。他開始稱它們為類——例如,鳥類,哺乳動物。因此,類定義很好地實現了定義您要建立的物件的共同特徵或型別。在宣告類定義後,您可以基於該定義建立物件。但是,為了做到這一點,您需要編寫以下特殊語法

Computer code
Animal dog = new Animal();


上面的程式碼使用Animal類的定義,有效地建立了一個名為dog的物件。用非程式設計師的語言來說,上面的程式碼可以翻譯成類似“建立一個名為dog,型別為Animal的新物件”。單個類定義允許您建立多個物件,如下面的程式碼所示

Computer code
Animal dog = new Animal();
Animal cat = new Animal();
Animal camel = new Animal();


基本上,您只需編寫一次類或型別定義的程式碼,然後使用它根據該規範建立無數個物件。儘管您可能無法理解這樣做的重要性,但這項小練習為您節省了大量時間(在 Java 出現之前的日子裡,程式設計師無法輕易獲得這種奢侈)。

擴充套件您的類定義

[編輯 | 編輯原始碼]

雖然您從類定義建立的每個物件本質上都是相同的,但必須有一種方法來區分程式碼中的這些物件。物件欄位(或簡稱欄位)使您的物件與其他物件不同。讓我們以我們目前的抽象為例。動物可以是狗、貓、駱駝或鴨子,但由於這種抽象非常通用,因此您需要定義對所有這些動物都通用的欄位,同時又使這些動物彼此區分。例如,您可以有兩個欄位:name(給這些動物中的任何一隻起的通用名稱)和legs(這些動物中的任何一隻行走所需的肢體數量)。當您開始定義物件時,它們開始看起來像這樣


Computer code
class Animal {

  String name;
  int legs;
}


在上面的程式碼中,您定義了兩個物件欄位

  • 一個名為name,型別為String的欄位;以及
  • 一個名為legs,型別為int的欄位。

這些特殊預定義型別稱為資料型別String資料型別用於可以儲存文字值的欄位,例如名稱,而int(整數)資料型別用於可以儲存數值值的欄位

注意
在不同的語言中,欄位被稱為不同的名稱。在其他程式語言語法中,它們可能被稱為狀態識別符號屬性成員變數。Java 在不同的上下文中使用“欄位”和“屬性”這兩個詞,正如接下來的部分所述。

圖 3:為了將Animal物件表示為 Java 環境中的一個系統,
您將其呈現為這樣。請注意欄位是如何呈現的。


為了演示欄位的工作原理,我們將繼續從我們修改後的類定義版本中建立物件,如下所示

Computer code
Animal animal1 = new Animal();
Animal animal2 = new Animal();

animal1.name = "dog";
animal1.legs = 4;

animal2.name = "duck";
animal2.legs = 2;


您可以使用.(點)或成員運算子來訪問已建立物件的欄位。在上面的示例中,我們建立了兩個型別為Animal的物件:animal1animal2。並且由於我們已經確定每個Animal都有兩個欄位,分別是namelegs,因此我們使用成員運算子訪問並修改了每個物件的這些欄位,以將它們區分開來。透過為不同的物件宣告不同的值,我們可以操作它們當前的狀態。因此,例如

  • animal1物件是"dog",有4條腿可以行走;而
  • animal2物件是"duck",有2條腿可以行走。

區分這兩個物件的是它們當前的狀態。這兩個物件都具有不同的狀態,因此即使它們是從同一個模板或類定義建立的,它們也作為兩個不同的物件脫穎而出。

向物件新增行為

[編輯 | 編輯原始碼]

此時,您的物件除了宣告一堆欄位之外,什麼也不做。作為一個系統,您的物件應該能夠與其環境和其他系統互動。要新增這種互動能力,您還需要向物件類定義新增互動行為。這種行為是使用稱為方法的程式設計結構新增到類定義中的。

Animal為例,您需要讓您的動物虛擬表示能夠在環境中移動。讓我們說,作為一種類比,您希望您的Animal物件能夠在其環境中行走。因此,您需要向我們的物件新增一個名為walk的方法。為此,我們需要編寫以下程式碼


Computer code
class Animal {

  String name;
  int legs;

  void walk() { }
}


當您編寫此程式碼時,有一件事立即變得顯而易見。就像類描述一樣,方法也帶有花括號。通常,花括號用於定義物件內的區域(或範圍)。因此,第一組花括號定義了類定義的範圍,稱為類級範圍。這組新的花括號以及方法定義了方法的進一步定義範圍,稱為方法級範圍

在本例中,我們方法的名稱為walk。但是請注意,我們方法的名稱也包含一組圓括號。這些圓括號不僅僅是方法的可視識別符號,它們還用於為我們的方法提供稱為引數的額外輸入資訊。

因此,方法使物件能夠

  1. 接受輸入:接收一些引數;
  2. 處理資訊:在其花括號內處理接收到的引數;以及
  3. 生成輸出:有時,返回一些內容。

本質上,方法使物件的行為更像一個系統。

請注意方法名稱之前的關鍵字void - 這告訴我們方法walk不返回任何內容。您可以將方法設定為返回任何資料型別 - 它也可以是Stringint

注意
在不同的程式語言中,方法被稱為不同的名稱。它們可能被稱為函式過程例程行為

圖 4:Animal物件現在可以表示為在 Java 環境中具有互動行為
如這裡所示。請注意欄位和方法表示之間的區別。


封裝的過程

[編輯 | 編輯原始碼]

到目前為止,我們已經徹底瞭解到任何物件都可以與其環境互動,並反過來受到環境的影響。在我們的示例中,Animal物件公開了一些欄位 - namelegs,以及一個方法 - walk(),供環境使用來操作物件。這種暴露形式是隱式的。使用 Java 程式語言,程式設計師有能力定義其他物件和環境對特定物件的訪問級別。

使用訪問修飾符

[編輯 | 編輯原始碼]

除了宣告和定義物件、它們的欄位和方法之外,程式設計師還可以定義對這些元素的訪問級別。這是使用稱為訪問修飾符的關鍵字完成的。

讓我們修改我們的示例來演示這種效果

Computer code
class Animal {

  public String name;
  public int legs;

  public void walk() { }
}


透過將所有欄位和方法宣告為public,我們確保它們可以在Animal類的範圍之外使用。這意味著任何其他物件(除了Animal)都可以訪問這些成員元素。但是,要限制對類中某些成員元素的訪問,我們始終可以使用private訪問修飾符(如下所示)。

Computer code
class Animal {

  private String name;
  private int legs;

  public void walk() { }
}


在本示例中,namelegs欄位只能在Animal類的範圍內訪問。此範圍之外的任何物件都無法訪問這兩個欄位。但是,由於walk()方法仍然具有public訪問許可權,因此它可以被此範圍之外的參與者和物件操作。訪問修飾符不僅限於欄位或方法,它們也可以用於類定義(如下所示)。

Computer code
public class Animal {

  private String name;
  private int legs;

  public void walk() { }
}


以下關鍵字列表顯示了可以與 Java 程式一起使用的有效訪問修飾符

關鍵字 描述
public 開啟對特定欄位或方法的訪問,以便在類的範圍之外使用。
private 限制對特定欄位或方法的訪問,使其只能在類的範圍內使用。
protected 對特定欄位或方法的訪問保留給繼承當前類的類。
有關這方面的更多內容將在繼承部分中討論。


華夏公益教科書