Java中10種覆蓋方法的方式

2021-08-29 23:58:41 字數 2929 閱讀 8465

1)子類方法的名稱、引數簽名和返回型別必須與父類方法的名稱、引數簽名和返回型別一致,修飾符可以相同也可以不同,但子類的訪問許可權不能低於父類的訪問許可權。

class aball 

public void method()

}public class extendsmethod extends aball

public void method()

public int method(int i)

}

2)子類方法不能縮小父類方法的訪問許可權。

3)子類方法不能丟擲比父類方法更多的異常。子類方法丟擲的異常必須和父類方法丟擲的異常相同,或者子類方法丟擲的異常類是父類方法丟擲的異常類的子類。另外,寫丟擲異常catch塊時,子類方法丟擲的異常在父類方法丟擲異常的前面。

4)方法覆蓋只存在於子類和父類(包括直接父類和間接父類)之間。在同乙個類中方法只能被過載,不能被覆蓋。

5)父類的靜態方法不能被子類覆蓋為非靜態方法。

6)子類可以定義與父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法。(靜態方法只能隱藏,不能覆蓋)

子類隱藏父類的靜態方法和子類覆蓋父類的例項方法區別:執行時,jvm把靜態方法和所屬的類繫結,而把例項方法和所屬的例項繫結。

class aball 

void method()

static void staticmethod()

}public class extendsmethod extends aball

void method()

static void staticmethod()

public static void main(string args)

}結果為:

method of extendsmethod

staticmethod of aball

method of extendsmethod

staticmethod of extendsmethod

引用變數sub1和sub2都引用extendsmethod類的例項,執行sub1.method()和sub2.method()時,都呼叫extendsmethod例項的method()方法,此時父類aball的例項方法method()被子類覆蓋。

引用變數sub1被宣告為

aball型別,執行sub1.staticmethod()時,呼叫aball類的staticmethod

()方法,說明父類的靜態方法不能被子類覆蓋。

引用變數sub2被宣告為

extendsmethod型別,執行sub2.staticmethod()時,呼叫extendsmethod類的staticmethod

()方法,說明父類的靜態方法被子類的靜態方法隱藏了。

7)父類的非靜態方法不能被子類覆蓋為靜態方法。

8)父類的私有方法不能被子類覆蓋。

class aball 

void method()

static void staticmethod()

}public class extendsmethod extends aball

void method()

static void staticmethod()

public static void main(string args)

}結果為:

method of extendsmethod

staticmethod of aball

method of extendsmethod

staticmethod of extendsmethod

執行sub2.print()方法時,因為print()方法在aball類中定義,因此aball方法會呼叫在aball類中定義的private型別的method

()方法。

把aball類的method

()方法改為public型別,期他**不變,

則執行結果為

aball

extendsmethod

原因是由於extendsmethod中的method

()方法覆蓋了aball類中的method

()方法,執行sub2.print()時,jvm會呼叫當前extendsmethod例項的method

()方法。

9)父類的抽象方法可以被子類通過兩種途徑覆蓋:一是子類實現父類的抽象方法;二是子類重新宣告父類的抽象方法。

abstract class aball 

abstract void method();

abstract void print();

}public abstract class extendsmethod extends aball

public void method()

// 重新宣告print()方法,並擴大訪問許可權,但不實現

public abstract void print();

}

10)父類的非抽象方法可以被覆蓋為抽象方法。

abstract class aball 

void method()

void print()

}public abstract class extendsmethod extends aball

public void method()

// 覆蓋父類的print()方法

public abstract void print();

}

java 方法的覆蓋

1.運用場景 假如有100個類,分別為sub1,sub2,sub3,它們的乙個共同行為是寫字,除了sub1類用腳寫字以外,其餘的類都用手寫字。我們可以抽象出乙個父類base,它有乙個方法write 表示寫字,為了提高 可重用性,write 應該採用大多數子類的實現方式。定義父類如下 public v...

java方法的覆蓋

方法覆蓋,從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點 1 ...

java中的覆蓋

override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋...