天天看點

java 方法的覆寫(overriding)與重載(override)

                                                                  java 方法的覆寫(overriding)與重載(override)

轉自:方法的覆寫與重載

方法的覆寫

在類繼承中,子類可以修改從父類繼承來的方法,也就是說子類能建立一個與父類方法有不同功能的方法,但具有相同的名稱、傳回值類型、參數清單。

  如果在新類中定義一個方法,其名稱、傳回值類型和參數清單正好與父類中的相同,那麼,新方法被稱做覆寫舊方法。

  參數清單又叫參數簽名,包括參數的類型、參數的個數和參數的順序,隻要有一個不同就叫做參數清單不同。

  被覆寫的方法在子類中隻能通過super調用。

  注意:覆寫不會删除父類中的方法,而是對子類的執行個體隐藏,暫時不使用。

  請看下面的例子:

?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

public

class

Demo{

public

static

void

main(String[] args) {

Dog myDog =

new

Dog(

"行行圈"

);

myDog.say();

// 子類的執行個體調用子類中的方法

Animal myAnmial =

new

Animal(

"行行圈線上"

);

myAnmial.say();

// 父類的執行個體調用父類中的方法

}

}

class

Animal{

String name;

public

Animal(String name){

this

.name = name;

}

public

void

say(){

System.out.println(

"我是一隻小動物,我的名字叫"

+ name +

",我會發出叫聲"

);

}

}

class

Dog

extends

Animal{

// 構造方法不能被繼承,通過super()調用

public

Dog(String name){

super

(name);

}

// 覆寫say() 方法

public

void

say(){

System.out.println(

"我是一隻小狗,我的名字叫"

+ name +

",我會發出汪汪的叫聲"

);

}

}

  運作結果:

複制代碼代碼如下:

我是一隻小狗,我的名字叫行行圈,我會發出汪汪的叫聲

我是一隻小動物,我的名字叫行行圈線上,我會發出叫聲

方法覆寫的原則:

  覆寫方法的傳回類型、方法名稱、參數清單必須與原方法的相同。

  覆寫方法不能比原方法通路性差(即通路權限不允許縮小)。

  覆寫方法不能比原方法抛出更多的異常。

  被覆寫的方法不能是final類型,因為final修飾的方法是無法覆寫的。

  被覆寫的方法不能為private,否則在其子類中隻是新定義了一個方法,并沒有對其進行覆寫。

  被覆寫的方法不能為static。如果父類中的方法為靜态的,而子類中的方法不是靜态的,但是兩個方法除了這一點外其他都滿足覆寫條件,那麼會發生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜态的,并且滿足覆寫條件,但是仍然不會發生覆寫,因為靜态方法是在編譯的時候把靜态方法和類的引用類型進行比對。

方法的重載:

  前面已經對Java方法重載進行了說明,這裡再強調一下,Java父類和子類中的方法都會參與重載,例如,父類中有一個方法是 func(){ ... },子類中有一個方法是 func(int i){ ... },就構成了方法的重載。

覆寫和重載的不同:

  方法覆寫要求參數清單必須一緻,而方法重載要求參數清單必須不一緻。

  方法覆寫要求傳回類型必須一緻,方法重載對此沒有要求。

  方法覆寫隻能用于子類覆寫父類的方法,方法重載用于同一個類中的所有方法(包括從父類中繼承而來的方法)。

  方法覆寫對方法的通路權限和抛出的異常有特殊的要求,而方法重載在這方面沒有任何限制。

  父類的一個方法隻能被子類覆寫一次,而一個方法可以在所有的類中可以被重載多次。