簡單總結 面向對象三大特性


面向對象三大特性

一、多態

1.面向對象四大基本特性:抽象,封裝,繼承,多態
抽象,封裝,繼承是多態的基礎。多態是抽象,封裝,繼承的表現

2.什么是多態
多態是指允許不同類的對象對同一消息作出不同的響應。

3.多態的作用
簡單來說:解藕。詳細點就是,多態是設計模式的基礎(既然是基礎,那么一些設計模式中肯定有多態的下面三個條件)

4.多態存在的三個條件(必須同時滿足!!!)
有繼承關系
子類重寫了父類方法
父類引用指向子類對象

5.注意:
因為多態存在必須要有“子類重寫父類方法”這個條件,那么下面幾種類型的方法沒辦法表現出多態的特性(因為不能被重寫或引用)
static方法:static修飾的方法是屬於類的,而不屬於實例
final方法:因為被final修飾的方法無法被子類重寫
private方法:被private修飾的發那個法對子類不可見,
protected方法:被protected修飾的方法可以被子類見到,也可以被重寫,但無法被外部所引用,無法引用,就沒有多態

6.多態的分類:
編譯時多態,方法的重載
運行時多態,方法的重寫

7.分析多態問題的幾條原則

比如有一個父類Father,有一個子類Children
(1)向上轉型是自動的。Father f=new Children()是自動的,不需要強轉。注意:向上轉型會丟失子類原有的方法
(2)向下轉型要強轉。即Children c=new Father()是無法編譯通過的,必須要Children c=(Children)new Father(),讓父類知道它要轉成具體哪個子類
(3)父類的引用能指向子類。如果子類沒有重寫被調用的父類方法,就使用父類的方法,反之子類重寫被調用的父類方法,就使用子類的方法
例如:

[復制代碼](javascript:void(0)😉

父類:
public class Father {
        public void say(){
        System.out.println("我是爸爸");
    }
}


[復制代碼](javascript:void(0)😉

[復制代碼](javascript:void(0)😉

子類:有繼承關系,並且重寫父類的方法say()
public class Children extends Father {
        public void say(){
        System.out.println("我是兒子");
    }
}

[復制代碼](javascript:void(0)😉

[復制代碼](javascript:void(0)😉

public class Test {
    public static void main(String[] args) {
        Father f=new Children(); //父類的引用指向子類對象。
        f.say();//因為子類重寫父類方法,所以這里其實是調用子類的方法
    }
}

[復制代碼](javascript:void(0)😉

二、封裝

1.什么是封裝
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。

封裝的三大好處:

  • 良好的封裝能減少耦合。
  • 只能通過規定的方法訪問數據。
  • 隱藏類的實例細節,方便修改和實現。

2.實際應用
(1)好處1:封裝確實可以使我們容易地修改類的內部實現,而無需修改使用了該類的客戶代碼。

[復制代碼](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private int age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(int age) {this.age = age;}
}

[復制代碼](javascript:void(0)😉

如果我們需要修改User這個類,把 age改為String 。你只有少數幾處使用了這個類還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,只需要稍微改變下 User類的setAge()方法即可。

[復制代碼](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private String age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(String age) {this.age = age;}
}

[復制代碼](javascript:void(0)😉

(2)好處2:可以對成員變量進行更精確的控制。

[復制代碼](javascript:void(0)😉

public class User {
    private int id;
    private String name;
    private int age;
    
    public int getId() {return id;}

    public void setId(int id) {this.id = id;}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}

    public void setAge(int age) {
        if(age>250){
            System.out.println("年齡不符合要求");//輸出提示信息
        }else {
            this.age = age;
        }        
    }
}

[復制代碼](javascript:void(0)😉

三、繼承

1.什么是繼承?
繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。

2。繼承的利弊
利:

  • 減小代碼和數據的冗余度,大大增加程序的重用性。
  • 繼承簡化了人們對事物的認識和描述,能清晰體現相關類間的層次結構關系
  • 提供多重繼承機制。

弊:

類與類產生了關系,其實也是繼承的一個弊端,繼承是一種強耦合關系,違背了開發的原則:低耦合,高內聚。

3.構造方法:
首先是通過構造方法來完成對象的初始化,子類的構造方法默認調用父類的構造方法,通過super()方式 。注意:如果用super關鍵字在子類里調用父類的構造方法,則必須在子類的構造方法中的第一行。
(1).父類有默認的構造方法,子類的構造方法默認執行super();調用父類構造方法進行實例化
(2).父類沒有默認構造方法(肯定是手寫了構造方法),子類構造方法中顯示使用super()調用父類構造方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM