java面對對象入門(7)-重寫與重載

方法重載和重載(換句話說,java中的多態)既不是一個非常困難的概念,也不是一個非常未知的主題。但是,我將在本文中介紹這個主題,因爲同時使用多個代碼示例在Java 中測面試試此類概念時,很容易犯錯誤。我在這裏沒有給出任何新概念,但是我打算修改您有關java方法重載和重載規則的現有知識。

1.方法重載規則

重載Java中的任何方法時,請牢記以下規則:

1)在Java中重載方法的首要原則是更改方法簽名。方法簽名由**參數數量,參數類型和參數順序(**如果它們是不同類型)組成。

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }
 
    // Overloading method
    public Integer sum(Float a, Integer b) {  //Valid
        return null;
    }
}

2)方法的返回類型從不屬於方法簽名的一部分,因此僅更改方法的返回類型並不等於方法重載

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }
 
    // Overloading method
    public Float sum(Integer a, Integer b) {     //Not valid; Compile time error
        return null;
    }
}

**3)**重載方法時,也不會考慮方法引發的異常。因此,您的重載方法將引發相同的異常,不同的異常,或者它僅不引發任何異常。對方法加載完全沒有影響

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) throws NullPointerException{
        return a + b;
    }
 
    // Overloading method
    public Integer sum(Integer a, Integer b) throws Exception{  //Not valid; Compile time error
        return null;
    }
}

2 .方法重寫規則

我們在上面閱讀了方法重載的規則,現在是時候列出在重寫java中的方法時應記住的規則了。
1)重寫方法和被重寫方法中的方法參數列表必須完全相同。如果它們不匹配,則最終將得到重載方法。
2)重寫方法
返回類型可以是在被重寫放法中聲明的返回類型的子類

public class SuperClass {
    //Overriden method
    public Number sum(Integer a, Integer b) {
        return a + b;
    }
}
 
class SubClass extends SuperClass {
    //Overriding method
    @Override
    public Integer sum(Integer a, Integer b) {      //Integer extends Number; so it's valid
        return a + b;
    }
}

3)在所有規則之上,私有,靜態和最終方法在Java中均不能以任何方式被覆蓋。就如此容易 !!

public class SuperClass {
    private Integer sum(Integer a, Integer b) {   //private method; overriding not possible
        return a + b;
    }
}
 
class SubClass extends SuperClass {
    //Overriding method
    public Integer sum(Integer a, Integer b) {   
        return a + b;
    }
}

4) 重寫方法不能拋出已檢查的異常,其層次結構比重寫方法拋出的異常高。比方說,例如父類中FileNotFoundException的重寫方法可以拋出異常,子類中的重寫方法可以拋出異常FileNotFoundException;但不允許拋出IOExceptionException,因爲IOExceptionException在層次上較高,即的超類FileNotFoundException
更重要的是,您可以忽略覆蓋方法中的異常聲明。這是允許的並且完全有效。同樣,無論重寫方法是否聲明該異常,重寫方法都可以引發任何未經檢查的(運行時)異常。

public class SuperClass {
    //Overriden method
    public Integer sum(Integer a, Integer b) throws FileNotFoundException {
        return a + b;
    }
}
 
class SubClass extends SuperClass {
    //Overriding method
    public Integer sum(Integer a, Integer b) throws IOException {       //Not valid; Compile time error
        return a + b;
    }
    //Exception IOException is not compatible with throws clause in SuperClass.sum(Integer, Integer)
    public Integer sum(Integer a, Integer b)  {                     //It's valid; Don't declare the exception at all is permitted.
        return a + b;
    }
}

5)另外請注意,重寫方法不能縮被重寫方法的訪問範圍。簡而言之,如果父類中的重寫方法受到保護,則子類中的重寫方法不能爲私有。它必須是受保護的(相同的訪問權限)或公共的(更廣泛的訪問權限)。

public class SuperClass {
    //Overriden method
    protected Integer sum(Integer a, Integer b) {
        return a + b;
    }
}
 
class SubClass extends SuperClass {
    //Overriding method
    //Not valid; Compile time error "Cannot reduce the visibility of the inherited method from SuperClass"
    private Integer sum(Integer a, Integer b)  {    
        return a + b;
    }
}

這就是這個簡單而重要的概念的全部內容,可以讓您在覈心Java和麪向對象編程中掌握基礎知識。
學習愉快!
**更多精彩請關注公衆號【lovepythoncn】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章