面向對象的三大特徵



        引言:關於“面向對象”的三大特徵,我想這是再基礎不過的東西,而正是這些基礎的東西,總是讓我模棱兩可。今天有時間就在網上找了些資料學習了下,順便整理了下來。感覺自己的基礎知識還是太薄弱了,還需要加強學習

封裝:
     首先,屬性可用來描述同一類事物的特徵, 行爲可描述一類事物可做的操作,封裝就是要把屬於同一類事物的共性(包括屬性與行爲)歸到一個類中,以方便使用.比如人,可用下面的方式封裝:
人{
    姓名(屬性一)
    性別(屬性二)
    吃飯(行爲之一)
    做事(行爲之二)
}

繼承:
     由於封裝,使得有共同特徵的一類事物的所有描述信息都被歸於一類之中,但我們知道,這並不是萬能的,有些事物有共性,但還存在區別,比如教師,簡單封裝起來如下:
教師{
    姓名(屬性一)
    性別(屬性二)

   吃飯(行爲之一)

    教書(行爲之二)
}
     上面對"教師"的封裝,與對"人"的封裝基本上差不多,只是多了一個特徵行爲:教書,教師有與人一樣的共性, 但我們不能說"人教書",也就是不能把教書封裝到"人"之中去,教書是教師的特徵行爲之一.  爲了省事地封裝教師(代碼的複用,這只是繼承存在的原因之一), 可以讓教師去繼承人,如:
 教師 extends 人{
    教書(行爲之一)
}
這樣,我們就不用重新定義那些已經被"人"這一個類所封裝的那些屬性與行爲了,而只需要使用繼承的方式,在人的基礎上拓展教師專有的行爲,即"教書"即可把教師描述出來;這樣的結果, 即是教師也同時擁有"人"之中所封裝的一切屬性與行爲, 還擁有自己的特徵行爲"教書".

多態:
     多態的概念發展出來,是以封裝和繼承爲基礎的(其實我覺得抽象也應該算是面向對象的大特徵之一,要封裝,抽象是必須的)

   實現多態,有二種方式:覆蓋,重載。
覆蓋:是指子類重新定義父類的函數的做法。
重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

簡單的理解一下多態,比如:
     人這個類,封裝了很多人類共有的特性,
     教師是人的子類,繼承了人的屬性與行爲,當然教師有自己的特徵行爲,比如老師教書;
     學生是人的子類,繼承了人的屬性與行爲,當然學生有自己的特徵行爲,比如學生上課;
   
     現在,當我們需要去描述教師與學生各自的行爲的時候, 我們可以分開來說"教師在教書",  "學生上課",  但如果我們要站在抽象的角度,  也就是從教師與學生的父類"人"的角度, 來同時描述他們各自的行爲時,我們怎麼描述?"人在教書"?"人在上課"?這是不是怪怪的很不合適?不合適的問題就在於, 對於行爲主體,我們使用了抽象層次的"人",而對於行爲本身, 我們卻使用了具體的"教書"與"上課". 怎麼解決呢? 那就需要解決抽象與具體的矛盾問題.
既然是站在抽象在角度來描述,那我們把行爲抽象一下,不就能同時描述了嗎?比如"人在做事"(教師授課與學生做作業都可以說成人在做事),這樣就解決了抽象層次與具體層次之間的矛盾.

     到了這一步, 我們可以把兩個描述: "教師在做事", "學生在做事" 兩者統一爲"人在做事",然後, 我們可以在"教師"的"做事"行爲中去調用教師自己的特徵行爲"教書",在"學生"的"做事"行爲中去調用學生自己的特徵行爲"做作業", 所以,當調用"人"去"做事"的時候,如果這個人是教師,那他所做的事實際上就是"教書",如果這個人是學生,那他所做的事實際上是"做作業".也就是說在這裏"人"是多態的, 在不同的形態時,特徵行爲是不一樣的, 這裏的"人", 同時有兩種形態,一種是教師形態,一種是學生形態,所對應的特徵行爲分別是"教書"與"上課".完成上述的描述過程, 其實就是多態機制的體現.

   多態, 就是站在抽象的層面上去實施一個統一的行爲,到個體(具體)的層面上時, 這個統一的行爲會因爲個體(具體)的形態特徵而實施自己的特徵行爲.

   其實只要明白:
能站在抽象的角度去描述一件事, 而針對這件抽象的事, 對於每個個體(具體)又能找到其自身的行爲去執行, 這就是多態.

        我個人對多態的理解是這樣的:人有很多種,有老師(可以教書),有學生(可以上課),有IT男(苦逼的寫代碼)等等,所以所人是多態的,有各種各樣的苦逼形態;或者例如美女是多態的,有高圓圓似的的美、有林青霞似的美,還有王祖賢似的美,所以美女也是多態的,有不同類型的美。

下面來看看具體的代碼:

public class Person {
 public String sex;
 public String name;
 
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void eatSomeThing(){
  System.out.println("eating someThing ...");
 }
 
 public void doSomeThing(){
  System.out.println("doing someThing ...");
 }
   
}


public class Teacher  extends Person{
	public void doSomeThing(){//覆蓋父類doSomeThing方法
		System.out.println("老師:教書...");
	}
}


public class Student extends Person {
 public void doSomeThing(){//覆蓋父類doSomeThing方法
	 System.out.println("學生:上課...");
 }
}


public class Client {
 public static void main(String[] args) {
  Teacher t = new Teacher();
  t.setName("張三");
  System.out.println(t.getName());
  t.eatSomeThing();//人的特徵
  t.doSomeThing();
  Student s = new Student();
  s.setName("李四");
  System.out.println(s.getName());
  s.eatSomeThing();//人的特徵
  s.doSomeThing();
 }
}

輸出結果:


張三
eating someThing ...
老師:教書...
李四
eating someThing ...
學生:上課...





發佈了64 篇原創文章 · 獲贊 341 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章