跳轉到內容

入門

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();


上面的程式碼實際上建立了一個名為 dog 的物件,它基於 Animal 的類定義。用非程式設計師的話來說,上面的程式碼可以翻譯成類似“建立一個名為 dogAnimal 型別的物件”。一個類定義可以讓你建立多個物件,如下面的程式碼所示

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條腿可以用來走路。

將這兩個物件區分開來的就是它們當前的狀態。這兩個物件具有不同的狀態,因此即使它們是從同一個模板或類定義中建立的,它們也仍然是兩個不同的物件。

為物件新增行為

[edit | edit source]

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

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


Computer code
class Animal {

  String name;
  int legs;

  void walk() { }
}


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

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

因此,方法使物件能夠

  1. 接受輸入:接收一些引數;
  2. 處理資訊:在它的花括號中處理接收到的引數;以及
  3. 生成輸出:偶爾,返回一些東西。

本質上,方法是使物件更像系統的關鍵。

注意方法名稱之前的void關鍵字 - 這告訴我們方法walk返回值。你可以將方法設定為返回任何資料型別 - 它可以是**String**或**int**。

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

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


封裝的過程

[edit | edit source]

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

使用訪問修飾符

[edit | edit source]

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

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

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 對某些欄位或方法的訪問許可權保留給繼承當前類的類。
有關這方面的更多資訊將在繼承部分討論。


華夏公益教科書