1. 程式人生 > >基礎篇——面向物件及多型性詳解

基礎篇——面向物件及多型性詳解

寫程式碼的四點:     1.明確需求。要做什麼?     2.分析思路。要怎麼做?(1,2,3……)     3.確定步驟。每一個思路要用到哪些語句、方法和物件。     4.程式碼實現。用具體的語言程式碼將思路實現出來。學習新技術的四點:     1.該技術是什麼?     2.該技術有什麼特點?(使用需注意的方面)     3.該技術怎麼使用?(寫Demo)     4.該技術什麼時候用?(在Project中的使用場景 )----------------------早計劃,早準備,早完成。-------------------------想要了解面向物件首先要知道什麼是物件。

物件

     物件就是現實世界中存在的人、事、物體等實體在計算機邏輯中的對映。     物件具有唯一性、抽象性、繼承性、多型性。每個物件都有自身唯一的標識,通過這種標識可找到相應的物件,在物件的整個生命週期中,它的標識都不會改變,不同的物件不能有相同的標識;抽象性是指將具有一致的屬性和行為的物件抽象成類,一個類就是一個物件,因此物件的抽象是類,類的具體化就是物件,也可以說類的例項是物件;繼承性也是類之間的一種關係,是子類自動共享父類的資料結構和方法的機制,;多型性是指相同的操作、函式或過程可作用於多種型別的物件上並獲得不同的結果,多型性增強了軟體的靈活性和重用性。     一切事物皆物件,物件是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作物件。物件不僅能表示具體的事物,還能表示抽象的規則、計劃和時間。物件具有狀態和行為,一個物件用資料值來描述它的狀態,用操作改變它的狀態,物件及其操作就是物件的行為。物件實現了資料和操作的結合,使資料和操作封裝於物件的統一體中。

面向物件(OO——Object Oriented)

      面向物件是一種思想,也是軟體開發方法。面向物件的方法是一種把面向物件的思想應用於軟體開發過程中,指導開發活動的系統方法。 在面向物件出現之前,計算機程式設計是基於面向過程的,面向過程強調的是功能行為。而面向物件是將功能封裝進物件,強調具備了功能的物件。通過面向物件的方式,將現實世界的事物抽象成物件,將現實世界的關係抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。所以說面向物件就是基於物件概念,以物件為中心,以類和繼承為構造機制,來認識、理解、刻畫現實世界和設計、構建相應的軟體系統。

面向物件的三大特徵: 封裝性、繼承性、多型性

     1.封裝性:只隱藏物件的屬性和實現細節,僅對外提供公共的訪問方式。                    好處:將變化隔離、便於使用、提高複用性、提高安全性;                    原則:將不需要對外提供的內容隱藏起來,把屬性隱藏,提供公共方法對其訪問。                    注:私有僅僅是封裝的一種體現形式而已。     2.繼承性:
extends,兩種事物間存在著一定的所屬關係,繼承的類就可以從被繼承的類中獲取一些屬性和方法,提高了程式碼的複用性。繼承是多型的前提。繼承性是面向物件程式設計語言不同於其它語言的最重要的特點,是其他語言所沒有的。                    注:子類中所有的建構函式都會預設訪問父類中的空引數的建構函式,預設第一行有super();若無空引數建構函式,子類中需指定;另外,子類建構函式中可自己用this指定自身的其他建構函式。      3.多型性:同一個物件(事物),在不同時刻體現出來的不同狀態。父類或介面定義的引用變數可以指向子類或具體實現類的例項物件。                    好處:提高了程式的擴充套件性、靈活性、簡化性;                    弊端:當父類引用指向子類物件時,雖提高了擴充套件性,但只能訪問父類中具備的方法,不可訪問子類中的方法;即訪問的侷限性。                   前提:a:實現或繼承關係;                              b:方法重寫(複寫父類方法);                              c:父類引用指向子類物件;

多型性詳解

多型性可以分為兩類:    1.方法的過載與重寫;
            a:過載:在同一個類中,方法名相同,引數列表不同,與返回值型別無關;                    過載的分類:a.1:引數個數不同;
                                        a.2:引數型別不同;            b:重寫:子類整合父類後,覆蓋父類中的某個方法的操作。
    2.物件的多型性:是從繼承關係中的多個類而來
            a:向上轉型:將子類例項轉為父類例項,格式:父類  父類物件 = 子類例項;(自動轉換)以基本資料型別操作為例:int i="a";(因為char的容量比int小,所以可以自動完成)            b:向下轉型:將父類例項轉為子類例項,格式:子類  子類物件 = (子類)父類例項;(強制轉換)以基本資料型別操作為例:char c = (char)97;因為整型是4個位元組比char2個位元組要大,所以需要強制完成。
多型中的成員訪問特點:    1.成員變數:                    編譯看左邊,執行看左邊。(Fu fu = new Zi(); fu.num呼叫的事父類Fu的num)
    2.構造方法:
                    建立子類物件的時候,訪問父類的構造方法,對父類的資料進行初始化。
    3.成員方法:
                    編譯看左邊,執行看右邊。(存在方法重寫,所以執行看右邊)
    4.靜態方法:
                    編譯看左邊,執行看左邊。(靜態和類相關,算不上重寫,所以執行看左邊)

多型性案例

package com.wy.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
 * 多型性:同一個物件(事物),在不同時刻體現出來的不同狀態。父類或介面定義的引用變數可以指向子類或具體實現類的例項物件。
 * 好處:提高了程式的擴充套件性、靈活性、簡化性;
 * 弊端:當父類引用指向子類物件時,雖提高了擴充套件性,但只能訪問父類中具備的方法,不可訪問子類中的方法;即訪問的侷限性。
 * 前提:a:實現或繼承關係;
 *       b:方法重寫(複寫父類方法);
 *       c:父類引用指向子類物件;
 */
public class Button1Activity extends Activity {

    @InjectView(R.id.tv1)
    TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_btn1);
ButterKnife.inject(this);
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
/**
         * 多型中的成員訪問特點:
         * 1.成員變數:
         * 編譯看左邊,執行看左邊。(Fu fu = new Zi(); fu.num呼叫的事父類Fu的num)
         * 2.構造方法:
         * 建立子類物件的時候,訪問父類的構造方法,對父類的資料進行初始化。
         * 3.成員方法:
         * 編譯看左邊,執行看右邊。(存在方法重寫,所以執行看右邊)
         * 4.靜態方法:
         * 編譯看左邊,執行看左邊。(靜態和類相關,算不上重寫,所以執行看左邊)
         */
tv1.append("答案:" + "\n");
tv1.append(a1.show(b) + "\n");      //①A and A
tv1.append(a1.show(c) + "\n");      //②A and A
tv1.append(a1.show(d) + "\n");      //③A and D
tv1.append(a2.show(b) + "\n");      //④B and A  ...
tv1.append(a2.show(c) + "\n");      //⑤B and A  ...
tv1.append(a2.show(d) + "\n");      //⑥A and D
tv1.append(b.show(b) + "\n");       //⑦B and B
tv1.append(b.show(c) + "\n");       //⑧B and B
tv1.append(b.show(d) + "\n");       //⑨A and D
}
}

class A {
    public String show(D obj) {
        return ("A and D");
}

    public String show(A obj) {
        return ("A and A");
}
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
}

    public String show(A obj) {
        return ("B and A");
}
}

class C extends B {
}

class D extends B {
}