方法重載和重載(換句話說,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
;但不允許拋出IOException
或Exception
,因爲IOException
或Exception
在層次上較高,即的超類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】