菜鳥成長系列-面向對象的四大基礎特性

按照以前的學習規劃,開始進行第一部分的學習。那麼今天就從新認識一下JAVA中的四大特性:抽象、封裝、繼承、多態java

抽象

學習面向對象,抽象仍是很重要的。面向對象最接近咱們人類的思惟,你的抽象能力就是你對萬物萬事總結和概括的能力。關於抽象,就是從具體事物抽出、歸納出它們共同的方面、本質屬性與關係等,而將個別的、非本質的方面、屬性與關係捨棄,這種思惟過程,稱爲抽象。在JAVA中表現就是使用abstract來修飾類,被abstract修飾的類成爲抽象類,通常是爲了爲子類提供一些共有的屬性和行爲,不一樣的子類根據自身的特性再進行具體的行爲實現。程序員

封裝

封裝是面向對象的重要原則,就是把對象的屬性和行爲(方法)結合爲一個獨立的總體,並儘量隱藏對象的內部實現細節;在java中,對於對象的內部屬性通常用private來實現隱藏,並經過set和get方法對外提供訪問接口。封裝其實是一種信息隱藏技術的實現方式。bash

  • 對象的數據封裝特性完全消除了傳統結構方法中數據與操做分離所帶來的種種問題,提升了程序的可複用性和可維護性,下降了程序員保持數據與操做內容的負擔。
  • 對象的數據封裝特性還能夠把對象的私有數據和公共數據分離開,保護了私有數據,減小了可能的模塊間干擾,達到下降程序複雜性、提升可控性的目的。

例如:對於客觀存在的人這個對象進行屬性和行爲抽象【此處僅僅是部分抽象】;使用private關鍵字來修飾人的屬性,並經過對應的set和get方法對外界提供訪問入口;在行爲方面,經過public關鍵字來修飾,對外提供具體的行爲描述。外界對象並不知道「人」這個對象在內部發生了什麼,僅僅是經過提供的方法來得到具體的描述信息。app

/**
 * 人
 * @author glmapper
 *
 */
public class Person {
    //姓名
    private String name;
    //年齡
    private int age;
    //性別
    private String sex;
    //身高
    private float high;
    //體重
    private float weight;
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public float getHigh() {
        return high;
    }
    public void setHigh(float high) {
        this.high = high;
    }
    public float getWeight() {
        return weight;
    }
    public void setWeight(float weight) {
        this.weight = weight;
    }


    public void eat(){
        System.out.println("吃東西");
    }

    public void walk(){
        System.out.println("走路");
    }

    public void study(){
        System.out.println("學習");
    }
}複製代碼

繼承

繼承是面向對象最顯著的一個特性,是從已有的類中派生出新的類,咱們把它稱之爲子類,子類繼承父類的屬性和行爲,並能根據本身的需求擴展出新的屬性和行爲,提升了代碼的可複用性。 ide

  • 提升了代碼的複用性。
  • 讓類與類之間產生了關係,給第三個特徵多態提供了前提。

Java的繼承經過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類稱爲父類(有的也稱其爲基類、超類),父類和子類的關係,是一種通常和特殊的關係;子類擴展父類,將能夠得到父類的所有屬性和方法。函數

男人是人的一種,男人的特徵是有鬍子,所以也有剪鬍子的行爲【有鬍子和剪鬍子並不是依賴關係;一個是屬性,一個是行爲】;可是男人繼承了人這個父類,所以,男人也具備例如姓名、性別、身高、體重等屬性,同時也具備父類人具備的吃飯、走路和學習的行爲。學習

/**
 * 男人
 * @author glmapper
 *
 */
public class Man extends Person{
    //鬍子
    private String  goatee;

    public String getGoatee() {
        return goatee;
    }

    public void setGoatee(String goatee) {
        this.goatee = goatee;
    }

    public void shaved(){
        System.out.println("剪鬍子");
    }
}複製代碼

重寫父類的方法:
大部分的時候,子類老是以父類爲基礎,額外添加新的屬性和方法。但有一種狀況例外:子類須要重寫父類的方法。例如男人吃東西比較快,女人吃東西比較慢,所以對於eat方法來講,Man能夠覆蓋父類的eat方法,來描述Man自己的特色。ui

@Override
public void eat(){
    System.out.println("快速的吃東西");
}複製代碼

當子父類中出現相同方法時,會先運行子類中的方法。
重寫的特色:方法名同樣,訪問修飾符權限不小於父類,返回類型一致,參數列表一致。this

多態

定義:指容許不一樣類的對象對同一消息作出響應。即同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式。(發送消息就是函數調用)
實現多態的技術稱爲:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。從語言特色上來講,Java引用變量有兩個類型:一個是編譯時類型,一個是運行時類型。編譯時的類型由聲明該變量時使用的類型決定,運行時的類型由實際賦給該變量的對象決定。若是編譯時類型和運行時類型不一致,就會出現所謂的多態(Polymorphism)。
封裝和繼承都是爲Java語言的多態提供了支撐;多態存在的三個必要條件:spa

  • 要有繼承;
  • 要有重寫;
  • 父類引用指向子類對象。

具體的實現方式就是:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

下一篇在說類和接口的時候再用具體的例子來描述覆蓋、重載。

相關文章
相關標籤/搜索