重寫java
❶ java中重載和重寫的區別是什麼
重載: 發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。
重寫: 發生在父子類中,方法名、參數列表必須相同,返回值范圍小於等於父類,拋出的異常范圍小於等於父類,訪問修飾符范圍大於等於父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。
❷ java涓瀛愮被閲嶅啓緇ф壙鐨勬柟娉曠殑瑙勫垯鏄浠涔堬紵
A銆侀噸鍐欒勫垯涔嬩竴錛歕x0dx0a 閲嶅啓鏂規硶涓嶈兘姣旇閲嶅啓鏂規硶闄愬埗鏈夋洿涓ユ牸鐨勮塊棶綰у埆銆俓x0dx0a錛堜絾鏄鍙浠ユ洿騫挎硾錛屾瘮濡傜埗綾繪柟娉曟槸鍖呰塊棶鏉冮檺錛屽瓙綾葷殑閲嶅啓鏂規硶鏄痯ublic璁塊棶鏉冮檺銆傦級 B銆侀噸鍐欒勫垯涔嬩簩錛歕x0dx0a 鍙傛暟鍒楄〃蹇呴』涓庤閲嶅啓鏂規硶鐨勭浉鍚屻俓x0dx0a閲嶅啓鏈変釜瀛鐢熺殑寮熷紵鍙閲嶈澆錛屼篃灝辨槸鍚庨潰瑕佸嚭鍦虹殑銆傚傛灉瀛愮被鏂規硶鐨勫弬鏁頒笌鐖剁被瀵瑰簲鐨勬柟娉曚笉鍚岋紝閭d箞灝辨槸浣犺ら敊浜轟簡錛岄偅鏄閲嶈澆錛屼笉鏄閲嶅啓銆 x0dx0aC銆侀噸鍐欒勫垯涔嬩笁錛歕x0dx0a 榪斿洖綾誨瀷蹇呴』涓庤閲嶅啓鏂規硶鐨勮繑鍥炵被鍨嬬浉鍚屻俓x0dx0aD銆侀噸鍐欒勫垯涔嬪洓錛歕x0dx0a 閲嶅啓鏂規硶涓嶈兘鎶涘嚭鏂扮殑寮傚父鎴栬呮瘮琚閲嶅啓鏂規硶澹版槑鐨勬鏌ュ紓甯告洿騫跨殑媯鏌ュ紓甯搞備絾鏄鍙浠ユ姏鍑烘洿灝戱紝鏇存湁闄愭垨鑰呬笉鎶涘嚭寮傚父銆俓x0dx0aE銆侀噸鍐欒勫垯涔嬩簲錛歕x0dx0a 涓嶈兘閲嶅啓琚鏍囪瘑涓篺inal鐨勬柟娉曘俓x0dx0aF銆侀噸鍐欒勫垯涔嬪叚錛歕x0dx0a 濡傛灉涓涓鏂規硶涓嶈兘琚緇ф壙錛屽垯涓嶈兘閲嶅啓瀹冦
❸ java里的重寫,重載,覆蓋的區別
重寫即覆蓋,重載與覆蓋的區別是:
1)方法覆蓋要求參數簽名必須一致,而方法重載要求參數簽名必須不一致;
2)方法覆蓋要求返回類型必須一致,而方法重載對此不作要求
3)方法覆蓋只能用於子類覆蓋父類的方法,而方法重載用於同一個類中所有的方法(包括從父類中繼承過來的方法)
4)方法覆蓋對方法的訪問許可權和拋出的異常有特殊的要求,而方法重載對此無要求
5)父類的一個方法只能被子類覆蓋一次,而一個方法在所在的類中可以被重載多次
❹ java什麼是方法重寫的語法規則
一、方法的重寫。
1、重寫只能出現在繼承關系之中。當一個類繼承它的父類方法時,都有機會重寫該父類的方法。一個特例是父類的方法被標識為final。重寫的主要優點是能夠定義某個子類型特有的行為。
class Animal {
public void
eat(){
System.out.println ("Animal is eating.");
}
}
class Horse extends Animal{
public void eat(){
System.out.println ("Horse is
eating.");
}
}
2、對於從父類繼承來的抽象方法,要麼在子類用重寫的方式設計該方法,要麼把子類也標識為抽象的。所以抽象方法可以說是必須要被重寫的方法。
3、重寫的意義。
重寫方法可以實現多態,用父類的引用來操縱子類對象,但是在實際運行中對象將運行其自己特有的方法。
public class Test {
public static
void main (String[] args) {
Animal h = new Horse();
h.eat();
}
}
class Animal {
public void eat(){
System.out.println ("Animal is
eating.");
}
}
class Horse extends
Animal{
public void
eat(){
System.out.println ("Horse is eating.");
}
public void
buck(){
}
}
一個原則是:使用了什麼引用,編譯器就會只調用引用類所擁有的方法。如果調用子類特有的方法,如上例的h.buck();
編譯器會抱怨的。也就是說,編譯器只看引用類型,而不是對象類型。
4、重寫方法的規則。
若想實現一個合格重寫方法,而不是重載,那麼必須同時滿足下面的要求!
重寫規則之一:重寫方法不能比被重寫方法限制有更嚴格的訪問級別。
(但是可以更廣泛,比如父類方法是包訪問許可權,子類的重寫方法是public訪問許可權。)
比如:Object類有個toString()方法,開始重寫這個方法的時候我們總容易忘記public修飾符,編譯器當然不會放過任何教訓我們的機會。出錯的原因就是:沒有加任何訪問修飾符的方法具有包訪問許可權,包訪問許可權比public當然要嚴格了,所以編譯器會報錯的。
重寫規則之二:參數列表必須與被重寫方法的相同。
重寫有個孿生的弟弟叫重載,也就是後面要出場的。如果子類方法的參數與父類對應的方法不同,那麼就是你認錯人了,那是重載,不是重寫。
重寫規則之三:返回類型必須與被重寫方法的返回類型相同。
父類方法A:void
eat(){} 子類方法B:int eat(){} 兩者雖然參數相同,可是返回類型不同,所以不是重寫。
父類方法A:int
eat(){} 子類方法B:long eat(){}
返回類型雖然兼容父類,但是不同就是不同,所以不是重寫。
重寫規則之四:重寫方法不能拋出新的異常或者比被重寫方法聲明的檢查異常更廣的檢查異常。但是可以拋出更少,更有限或者不拋出異常。
例:
import java.io.*;
public class Test
{
public static void main (String[]
args) {
Animal h =
new Horse();
try
{
h.eat();
}
catch (Exception e) {
}
}
}
class Animal
{
public void eat() throws
Exception{
System.out.println ("Animal is eating.");
throw new
Exception();
}
}
class Horse extends
Animal{
public void eat() throws
IOException{
System.out.println ("Horse is eating.");
throw new
IOException();
}
}
這個例子中,父類拋出了檢查異常Exception,子類拋出的IOException是Exception的子類,也即是比被重寫的方法拋出了更有限的異常,這是可以的。如果反過來,父類拋出IOException,子類拋出更為寬泛的Exception,那麼不會通過編譯的。
注意:這種限制只是針對檢查異常,至於運行時異常RuntimeException及其子類不再這個限制之中。
重寫規則之五:不能重寫被標識為final的方法。
重寫規則之六:如果一個方法不能被繼承,則不能重寫它。
比較典型的就是父類的private方法。下例會產生一個有趣的現象。
public class Test {
public static
void main (String[] args) {
//Animal h = new Horse();
Horse h = new
Horse();
h.eat();
}
}
class Animal {
private void eat(){
System.out.println ("Animal is
eating.");
}
}
class Horse extends
Animal{
public void
eat(){
System.out.println ("Horse is eating.");
}
}
這段代碼是能通過編譯的。表面上看來違反了第六條規則,但實際上那是一點巧合。Animal類的eat()方法不能被繼承,因此Horse類中的eat()方法是一個全新的方法,不是重寫也不是重載,只是一個只屬於Horse類的全新的方法!這點讓很多人迷惑了,但是也不是那麼難以理解。
main()方法如果是這樣:
Animal h = new Horse();
//Horse h = new
Horse();
h.eat();
編譯器會報錯,為什麼呢?Horse類的eat()方法是public的啊!應該可以調用啊!請牢記,多態只看父類引用的方法,而不看子類對象的方法!