封裝、繼承、重載、重寫、多態

  有時候,代碼寫的很多,但有些術語卻老是記得不太清楚;有些原理,明明常常用到,但卻不太會描述。既然如此,那就記錄下來,印象不深的時候再來看看。ide

  1.封裝:把對象的屬性、操做(或業務)結合爲一個總體(class),並儘量得隱藏內部實現細節,使得對數據的訪問只能經過已定義的接口。測試

public class Person {
    private String name = "張三";
    
    private int age = 18;

    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 void eat(){
        System.out.println("人要吃東西。");
    }
    
}

  上述代碼中,把姓名、年齡屬性和吃飯行爲都封裝到person類中的作法,叫作是封裝。this

 

  2.繼承:從已有的類中派生出新的類,新的類能吸取已有類中的屬性與方法,並能拓展新的能力。被繼承的類稱之爲「父類」或「基類」,派生出的新類稱之爲該類的子類。spa

     重寫:子類對從父類繼承而來的方法進行修改,返回值和形參都不能改變(能夠用註解@override來校驗重寫是否成功),子類重寫的方法不屬於新增的方法,重寫又叫作覆蓋。特別注意,父類的成員變量和靜態變量不會被重寫,僅僅會被隱藏,被隱藏的變量沒法被訪問。code

public class Son extends Person {
    //私有屬性沒法被繼承
    private int age = 1;
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    //重寫父類方法
    @Override
    public void eat() {
        System.out.println(this.getAge() + "歲的兒子" + this.getName() + "說:爸爸,我餓。");
    }
}

public class Test {
    
    //測試方法1
    @org.junit.Test
    public void test1() throws Exception {
        Son son = new Son();
        son.eat();
    }

}

執行結果:1歲的兒子張三說:爸爸,我餓。

  上述代碼中,父類name屬性被子類繼承,因此執行結果中,兒子也叫作張三。而eat()方法被重寫,子類對象調用的是重寫後的eat()方法。對象

 

  3.重載:在一個類中存在多個方法名稱相同,但參數簽名不一樣(參數的個數或者類型不一樣)。(修飾符、返回值類型能夠相同也能夠不一樣)blog

public class Reload {
    
    public static void reload(){
        System.out.println("無參重載方法。");
    }
    
    public void reload(String s){
        System.out.println("string參數重載方法。");
    }
    
    public void reload(String s, int i){
        System.out.println("string,int參數重載方法。");
    }
    
    protected String reload(int i){
        System.out.println("int參數重載方法。");
        return "";
    }
}

public class Test {
    
    @org.junit.Test
    public void test2() throws Exception {
        Reload reload = new Reload();
        reload.reload();
        reload.reload("");
        reload.reload("",1);
        reload.reload(1);
    }

}

執行結果:
    無參重載方法。
    string參數重載方法。
    string,int參數重載方法。
    int參數重載方法。

 

  4.多態:容許不一樣類的對象對同一消息作出響應。即同一操做做用於不一樣的對象,能夠有不一樣的解釋,產生不一樣的執行結果。這也意味着一個對象有着多重特徵,能夠在特定的狀況下,表現不一樣的狀態,從而對應着不一樣的屬性和方法。繼承

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

public class Person {
    private String name = "張三";
    
    private int age = 18;
    
    public Person(){
        System.out.println("父類的無參構造器:" + this.getName() + "今年" + this.getAge() +"歲。");
        this.eat();
    }
    
    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 void eat(){
        System.out.println("人要吃東西。");
    }
    
}

public class Son extends Person {
    //私有屬性沒法被繼承,由於此變量名在父類中存在,故父類中此變量將被隱藏
    private int age = 1;
    
    public static String addr = "abc";
    
    public Son(){
        //在執行子類的構造方法以前,一定先調用父類的構造器,若無顯示,則默認調用super()
        //默認:super();
        System.out.println("子類的無參構造器:" + this.getName() + "今年" + this.getAge() +"歲。");
    }
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    //重寫父類方法
    @Override
    public void eat() {
        System.out.println(this.getAge() + "歲的兒子" + this.getName() + "說:爸爸,我餓。");
    }
}

public class Test {
    @org.junit.Test
    public void test3() throws Exception {
        Person person = new Son();
        person.eat();
        
    }
}

執行結果:

  父類的無參構造器:張三今年0歲。
  0歲的兒子張三說:爸爸,我餓。
  子類的無參構造器:張三今年1歲。
  1歲的兒子張三說:爸爸,我餓。get

  定義父類引用指向子類對象,在建立子類對象時,步驟:

1首先會隱式調用父類無參構造器,因而先打印了「父類的無參構造器:張三今年0歲」。而爲什麼是0歲而不是18歲的緣由,是子類中存在age變量與父類同名,故父類的age變量被隱藏。2而在父類構造器中調用了this.eat(),實際調用的仍是子類重寫後的方法(畢竟調用對象都是子類對象,僅僅引用類型爲父類而已),3接着super()構造器執行完成(做用是初始化父類變量和方法等),開始執行子類構造器(先初始化子類變量),4調用子類eat()方法。

相關文章
相關標籤/搜索