1. 程式人生 > >談談我對面向物件以及類與物件的理解

談談我對面向物件以及類與物件的理解

對於剛接觸JAVA或者其他面向物件程式語言的朋友們來說,可能一開始都很難理解面向物件的概念以及物件的關係。

面向物件

首先,一言不和先百度,得到如下定義:

一切事物皆物件,通過面向物件的方式,將現實世界的事物抽象成物件,現實世界中的關係抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。

我們知道,編寫程式的目的是為了解決現實生活中的問題,程式設計的思維方式也應該貼近現實生活的思維方式。面向物件的程式設計方式就是為了實現上述目的二出現的。它使得程式設計工作更直觀,更易理解。需要注意的是這裡說的程式設計不光是coding還包括了設計的過程也是面向物件的

為什麼說面向物件更貼近實際生活

想象一下,當我們向別人描述一樣事物時,我們都是怎麼說的?”它有像鴨子一樣的嘴巴”,”它有4條退”,”爪子裡還有蹼”,”它是哺乳動物但卻是卵生”。

這種HAS A 和 IS A的表達方式往往可以簡單而高效的描述一樣事物。HAS A描述事物的屬性或行為,IS A 則說明了事物的類屬。

當我們把這一系列的屬性組合起來便得到的鴨嘴獸這一,同時哺乳動物一詞簡單精煉的表面了所有哺乳動物的特性而不用一一列出,這是繼承特性的體現,同時卵生又是多型的體現。

這就是面向物件的思維特點,抽取(抽象)有用的屬性和行為(拋棄哪些無需關係的)組織(封裝)成一個類。這個過程中你也許會發現很多屬性或方法是和另一個類相同的,那麼你就可以採用繼承的方式避免重複(當然這個過程也有可能是,當你設計完一個個類後,才發現他們有共同點,然後再抽取出基類)。更重要的是,繼承是可以不原樣照搬的,我們可以通過過載

實現相同行為或屬性的特有實現方式,這種特點稱之為多型,例如同樣的生產行為,實現方式由胎生變為卵生。請大聲念出,並牢牢記住面向物件的四個特徵:

  • 抽象

  • 封裝

  • 繼承

  • 多型

與早期結構化程式設計相比

早期結構化程式設計是面向過程的(功能),換句話說程式是由功能的集合組成,而呼叫者是作為功能的引數傳入的。而在面向物件的程式中,物件是主體,程式是由物件的集合組成。一個物件中包含一系列符合設計的功能供其他物件呼叫。這麼說可能還是比較抽象,
,例如當我們設計一個五子棋遊戲時,
面向過程的設計思路就是首先分析問題的步驟:
1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。
把上面每個步驟用分別的函式來實現,問題就解決了。

而面向物件的設計則是從另外的思路來解決問題。整個五子棋可以分為:
1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。


第一類物件(玩家物件)負責接受使用者輸入,並告知第二類物件(棋盤物件)棋子佈局的變化,棋盤物件接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類物件(規則系統)來對棋局進行判定。

隨便寫點程式碼,大家看看就好,不要太認真….

/**
玩家類
**/

public class Player {
   String name;       //棋手名稱
   boolean isFirst;  //是否先手
   int color_flag;  //代表顏色  0-白 1-黑
   Table table;//棋盤物件
   
 public Player(String name,boolean isFirst;int color_flag){
          this.name=name;
          this.isFirst=isFirst;
          this.color_flag=color_flag;
   }
  
 /**
 下棋,x,y為落子座標
 **/

 public void play(int x,int y) throws Exception{
     if(this.table==null){
        throw new IllegalArgumentException("玩家還未註冊到棋盤!");
     }
   table.setNewPieces(x,y);
 }
   
   public void setTable(Table table){
      this.table=table;
   } 
}
/**
棋盤類
**/

public class Table{
 List<Player> playerList=new ArrayList<Player>();
 Referee referee ;
 public Table(){
  referee =new Referee(this);
 }
 /**
   註冊玩家
 **/

 public void registPlayer(Player player) throws Exception {
     //檢測棋盤中的玩家是否已滿,先手玩家和玩家選色是否衝突。
     .......
    playerList.add(player);
    player.setTable(this);
 }

  /**
   落子
  **/


  public void setNewPieces(int x , int y){
         //重新繪製棋盤
         ......
        //呼叫裁判物件,判斷結果
     if(referee.isEnd){
         End();
       }
  }

  public void End(){
     .......
 }
}
/**
裁判類
**/

public class Referee(){
 Table table;
 public Referee(Table table){
   this.table=table;
}

  public boolen isEnd(){
     //判斷輸贏
     ....
   return false
  }
}

然而事實上,通過上述示例程式碼,我們不難發現,即使我們使用面向物件的方式,上面例子裡面向過程中提到的幾個下棋過程我們還是都實現了的,只不過程被封裝到了類的方法中。所以說其實面向物件和麵向過程並不是程式設計的區別(需要實現的業務邏輯的量不會產生變化),而是設計的區別

類與物件

類是抽象的,而物件是具體的

如何理解上面的話呢? 例如鴨嘴獸是型別,具體的鴨嘴獸A、鴨嘴獸B就是物件了。在JAVA中物件是通過new關鍵字宣告的。 再例如,《紅色警戒》中美國大兵是一兵種,點選製造後從兵營裡出來的那個會開槍的傢伙就是物件了:


的定義就是一個模板,它描述的一類物件的屬性與行為。類往往是抽象的、沒有實體的。哺乳動物是的概念,是抽象的,現實中沒有哺乳動物這一實體,只有具體的如老虎,獅子等。程式設計工作中套用這一思維模式,我們將程式中的例項抽象為類,例如一個系統中的使用者有張三、李四我們會把他們抽象為Person類,或者稱之為一個名為Person的資料型別。

物件則是根據所屬模板創造出來的實實在在的事物。在程式中我將這個實實在在的事物稱之為例項,我們為它的屬性賦上特定的值,讓它成為張三或者李四。在記憶體裡來說,物件是表示的就是具體資料。

前面說的都是概念性的東西,下面我們說說實際的運用過程中的理解。

從資料型別來說

以java為例,資料型別分為基本資料型別引用資料型別

基本資料型別就是byte,short,int,long,double,char,boolean;其它的,需要用到new關鍵字來賦值的都是引用資料型別。 類與物件指的便是引用資料的型別與其值(這裡指的類不光是class,還包括介面、陣列、列舉、註解)。 而引用指的是記憶體地址的引用,關於這點在後面說的記憶體時會細說。
看下面的程式碼:

int a =1
Person b=new Person();

a 和 b 都是本身無意義的變數名。需要關注的是:a的型別是基本資料型別int值為1,而b的型別是Person屬於引用型別,其引用的是new Person()這個物件。我們往往會說物件xx,比如這裡的物件b。但實際上b只是物件的引用,真正的物件是後面的new Person()

需要注意的是String也是引用資料型別,只不過因為使用率非常高,所以對於String,jvm支援其可 以像基本資料型別一樣使用:String a = “abc”; 同等於 String a = new String(“abc”);

總之呢,簡單來說指的的引用資料的型別,物件是具體賦的值。為了更深入理解,我們下面需要解釋下這個引用是如何體現的。

什麼是引用(從記憶體來說)

要深入理解什麼是類,什麼是物件,什麼又是引用,就離不開說說java的記憶體使用方式。

在java中記憶體被大致劃分為棧(stack)堆(heap) (之所以是大致,是因為還包括其它幾部分就不在這細說)。堆疊的介紹可以參考這裡

在這裡我們只說一點:java中,基本資料型別以及物件的引用都儲存在棧(stack),而物件則儲存在堆(heap)中,例如當如下程式碼:

int a=1;
Person p;

記憶體中的狀態大致如下:

int a = 1 是直接在棧中開闢空間,而對於未進行例項化的Person p因為沒有有效的記憶體地址引用它的值是null。而當代碼進行如下修改時:

int a =1 ;
Person p = new Person();

記憶體中的狀態大致如下:

Person p=new Person();使得p的值=0x8da23也就是物件new Person();中的地址。所以,到這裡後就不難理解之前說的物件的引用了,所謂引用其實就是堆記憶體地址的引用。

相關推薦

談談面向物件以及物件理解

對於剛接觸JAVA或者其他面向物件程式語言的朋友們來說,可能一開始都很難理解面向物件的概念以及類和物件的關係。面向物件首先,一言不和先百度,得到如下定義:一切事物皆物件,通過面向物件的方式,將現實世界的事物抽象成物件,現實世界中的關係抽象成類、繼承,幫助人們實現對現實世界的抽

JavaSE之面向物件程式設計—物件下——2

                        &n

JavaSE之面向物件程式設計—物件下——3

                        &n

JavaSE之面向物件程式設計—物件下—— 1

一、程式碼塊 在Java語言中我們總是感受到當遇到一個難的東西,就用一個大括號把它括起來,這樣被大括號括起來的程式碼塊就叫程式碼塊。程式碼塊一共有四種:普通程式碼塊、構造塊、靜態塊、同步程式碼塊。下面我們先介紹前三種程式碼塊。 1.普通程式碼塊 定義:普通程式碼塊就是在定義在方法中的程式碼塊

JavaSE之面向物件程式設計—物件(上)

1.面向物件程式設計簡介: [點一下就可以看到這個內容喲] (https://blog.csdn.net/ZhuiZhuDream5/article/details/83831961) 2.類與物件的定義與使用: [帶你進一步走進java] (https://blog.csdn.net/Zh

JavaSE之面向物件程式設計—物件(上)—— 5

首先我們來認識一下static關鍵字表示什麼:static關鍵字表示靜態的意思,更加通俗的解釋就是static修飾屬性或者方法它表示類的屬性或者方法,而前面所學的都表示物件的熟悉感或者方法。下面我們將從兩個方面來介紹static關鍵字。 一、static屬性 static屬性也叫類屬性,對於

JavaSE之面向物件程式設計—物件(上)—— 4

一、首先介紹一下this關鍵字的用法: 總的來說this共有三類用法: 1.this呼叫本類屬性 2.this呼叫本類方法 3.this表示當前物件 下面通過栗子來具體的解釋每種用法: 1.this呼叫本類屬性 注意:一個檔案只能有一個公有的類,並且檔名應該和公有的類名一致;如果定義一個類沒

JavaSE之面向物件程式設計—物件(上)—— 3

一、private實現封裝處理和構造方法(匿名物件) 1.private實現封裝處理 封裝是java的一大特性,private只是為實現封裝處理做了一個鋪墊。我們之所以存在封裝是因為封裝可以是我們的程式更加的有序,更加的安全private它表示私有化,它可以幫助我們實現面向物件的這一特性。

JavaSE之面向物件程式設計—物件(下)

1.程式碼塊 [分類詳細呢] (https://blog.csdn.net/ZhuiZhuDream5/article/details/83963433) 2.內部類的定義與使用 [面試常考點,非常的重要] (https://blog.csdn.net/ZhuiZhuDream5/artic

JavaSE之面向物件程式設計—物件(下)—— 6

                        &n

JavaSE之面向物件程式設計—物件(下)—— 4 and 5

                        &n

JAVA基礎之類和物件以及之間的關係

面向物件是當前軟體開發的主流設計規範,是一種程式語言模式。 面向物件主要包括面型物件分析,面型物件設計,面型物件程式設計。 面型物件分析就是以面向物件“類”的概念去認識問題,分析問題。 1.下面舉一個很簡單的例子,介紹如何建立一個類,以及如何建立類的物件,構造方法,自己定義的方法。

Java SE面向物件--06.物件、封裝、構造方法

學習目標: 面向物件 類與物件 三大特徵——封裝 構造方法 一、面向物件 1.1 引入面向物件(瞭解) 在開發的過程中,我們經常會遇到在多個程式中使用到同一個功能的情況。如下需求: 需求:定義類,在類中有定義功能對陣列求和的需求 clas

java面向物件物件關係

1.java面向物件 面向物件是一種開發模式,但最早使用的開發模式是面向過程 面向過程:指的是針對某一個問題單獨提出解決方案以及程式碼開發 即是:面向過程的方法寫出來的程式是一份蛋炒飯 恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜

面向物件程式設計,物件

'''面向過程的程式設計思想 核心過程二字,過程指的是解決問題的步驟,即先幹什麼\再幹什麼\後幹什麼 基於該思想編寫程式就好比在設計一條流水線,是一種機械式的思維方式 優點:複雜的問題流程化\進而簡單化 缺點:可擴充套件性差面向物件的程式設計思想 核心是物件二字,物件是特徵與技能

【java】面向物件程式設計——物件的繼承和多型

一、程式碼塊 程式碼塊定義:使用 {} 定義的一段程式碼。 根據程式碼塊定義的位置以及關鍵字,又可分為以下四種: 普通程式碼塊(定義在方法中,除錯) 構造塊(定義在類中的(不加修飾符)) 靜態塊 同步程式碼塊 構造塊 構造塊在每次產生一個新的物件就呼叫一次構

【java】面向物件程式設計——物件的封裝

Java比C更方便的地方在於Java是面向物件的。面向物件的特徵: 1、封裝 ; 2、繼承 ; 3、多型; 以下對面向物件的封裝特徵進行簡述: 一、類與物件的定義與使用 類是指共性的概念,物件是一個具體的、可以使用的事物。 首先產生類,而後才可以產生物件。 類的組成: 1.

java面向物件物件,區域性變數成員變數,基本型別和引用型別作為引數傳遞)

一.類和物件的區別 類是對某一類事物的抽象描述,而物件用於表示現實中該類事物的個體 可以將玩具模型看作是一個類,將一個個玩具看作物件,從玩具模型和玩具之間的關係便可以看出類與物件之間的關係。類用於描述多個物件的共同特徵,它是物件的模板。物件用於描述現實中的個體,它是類的例項 二.區域性變數和成員變數

面向物件基礎——物件的定義

 面向物件的概念 封裝性:對外部不可見。可以保護程式中的某些內容。 繼承性:擴充套件功能的。 類與物件的關係: 定義類和物件的方法? 類圖的畫法:Person類圖 分為三層: 第一層表示

java -面向物件程式設計-物件

上一章講了面向物件程式設計的理念以及為什麼要學習面向物件程式設計。但是我們也說了。面向物件程式設計是一個理念,要掌握它不是一日之功,而是要不斷地學習,實踐再學習。而今天說講的內容,就是你學習面向物件程式設計的第一步:類與物件。這是面向物件程式設計中最基礎的一個部