基礎篇——面向物件及多型性詳解
阿新 • • 發佈:2019-02-05
寫程式碼的四點: 1.明確需求。要做什麼? 2.分析思路。要怎麼做?(1,2,3……) 3.確定步驟。每一個思路要用到哪些語句、方法和物件。 4.程式碼實現。用具體的語言程式碼將思路實現出來。學習新技術的四點: 1.該技術是什麼? 2.該技術有什麼特點?(使用需注意的方面) 3.該技術怎麼使用?(寫Demo) 4.該技術什麼時候用?(在Project中的使用場景 )----------------------早計劃,早準備,早完成。-------------------------想要了解面向物件首先要知道什麼是物件。 面向物件是一種思想,也是軟體開發方法。面向物件的方法是一種把面向物件的思想應用於軟體開發過程中,指導開發活動的系統方法。 在面向物件出現之前,計算機程式設計是基於面向過程的,面向過程強調的是功能行為。而面向物件是將功能封裝進物件,強調具備了功能的物件。通過面向物件的方式,將現實世界的事物抽象成物件,將現實世界的關係抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。所以說面向物件就是基於物件概念,以物件為中心,以類和繼承為構造機制,來認識、理解、刻畫現實世界和設計、構建相應的軟體系統。 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.靜態方法:
編譯看左邊,執行看左邊。(靜態和類相關,算不上重寫,所以執行看左邊)
物件
物件就是現實世界中存在的人、事、物體等實體在計算機邏輯中的對映。 物件具有唯一性、抽象性、繼承性、多型性。每個物件都有自身唯一的標識,通過這種標識可找到相應的物件,在物件的整個生命週期中,它的標識都不會改變,不同的物件不能有相同的標識;抽象性是指將具有一致的屬性和行為的物件抽象成類,一個類就是一個物件,因此物件的抽象是類,類的具體化就是物件,也可以說類的例項是物件;繼承性也是類之間的一種關係,是子類自動共享父類的資料結構和方法的機制,;多型性是指相同的操作、函式或過程可作用於多種型別的物件上並獲得不同的結果,多型性增強了軟體的靈活性和重用性。 一切事物皆物件,物件是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作物件。物件不僅能表示具體的事物,還能表示抽象的規則、計劃和時間。物件具有狀態和行為,一個物件用資料值來描述它的狀態,用操作改變它的狀態,物件及其操作就是物件的行為。物件實現了資料和操作的結合,使資料和操作封裝於物件的統一體中。面向物件(OO——Object Oriented)
面向物件的三大特徵: 封裝性、繼承性、多型性
1.封裝性:只隱藏物件的屬性和實現細節,僅對外提供公共的訪問方式。 好處:將變化隔離、便於使用、提高複用性、提高安全性; 原則:將不需要對外提供的內容隱藏起來,把屬性隱藏,提供公共方法對其訪問。 注:私有僅僅是封裝的一種體現形式而已。 2.繼承性:多型性詳解
多型性可以分為兩類: 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 { }