java覆蓋和重寫
『壹』 java錛氣樼埗綾葷殑涓涓鏂規硶鍙鑳借瀛愮被瑕嗙洊涓嬈★紝鑰屼竴涓鏂規硶鍦ㄦ墍鍦ㄧ殑綾諱腑鍙浠ヨ閲嶈澆澶氭°傗
灝辨槸閲嶅啓鍜岄噸杞界殑鍖哄埆
閲嶅啓錛堝嵆瑕嗙洊錛夋槸瀵圭埗綾繪柟娉曠殑閲嶆柊瀹炵幇錛岄偅涔堜竴涓綾諱腑鑲瀹氬彧鑳介噸鍐欎竴嬈
閲嶈澆璇寸櫧浜嗗氨鏄涓嶅悓鐨勬柟娉曞洜涓哄弬鏁頒笉涓鏍
榪欏彞璇濈殑鎰忔濇槸鐖剁被鐨勬柟娉曪紝涓涓瀛愮被鍙鑳介噸鍐欎竴嬈★紝鍟婂圭殑灝辨槸浣犲悗闈㈢悊瑙g殑
『貳』 java重寫已定義好的類中的方法
java中重寫已定義好的類中的方法,只需要定義一個類繼承該類,然後在子類中寫出一個與該方法的返回值、名字、參數列表全部一致,但是函數內容不同即可完成重寫操作。在java中有重載和覆蓋(即重寫)兩個概念,重載是在同一個類中,方法名相同,參數列表或者參數個數與參數順序不一致即可重載;而覆蓋是在子父類中,子類的方法與父類的方法完全一致,但是方法內容不同叫做覆蓋也叫重寫。
『叄』 Java中覆蓋和重載的區別
Java中覆蓋和重載的區別如下:
override 可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,而在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload對來說可能比較熟悉,可以翻譯為重載,它是指可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
下面是對override和overload的測試程序,其中注釋中的內容都是會產生編譯錯誤的代碼,將注釋去掉,看看在編譯時會產生什麼效果。
// 對overload測試的文件:OverloadTest.java
public class OverloadTest {
// 下面幾個方法用來驗證可以通過定義不同的參數類型和參數的數目進行方法重載。
public void fun(){
System.out.println("method fun in OverloadTest, no parameter");
}
public void fun(float f) {
System.out.println("method fun in OverloadTest, parameter type: float");
}
public void fun(int i){
System.out.println("method fun in OverloadTest, parameter type: int");
}
public void fun(int i1, int i2) {
System.out.println("method fun in OverloadTest, parameter type: int, int");
}
// 下面的兩個方法用來驗證可以通過定義不同的參數順序進行方法重載。
// 需要注意:這里的參數肯定不是相同的類型,否則的順序的先後就毫無意義。
public void fun1(int i, float f) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float");
}
public void fun1(float f, int i) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int");
}
// 下面的兩個方法用來驗證方法拋出的異常對於重載的影響.
// 無論是異常的類型還是異常的個數都不會對重載造成任何的影響。
public void fun2() throws TestException {
System.out.println("fun2 in OverloadTest, exception: TestException");
}
public void fun2(int i) throws TestException, TestException1 {
System.out.println("fun2 in OverloadTest, exception: TestException, TestException1");
}
public void fun2(float f) throws Exception {
System.out.println("fun2 in OverloadTest, exception: Exception");
}
// 不能通過拋出的異常類型來重載fun方法。
//public void fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception");
//}
// 不能通過返回值重載fun方法。
//public boolean fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean");
// return true;
//}
private void fun3() { }
// 不能通過不同的訪問許可權進行重載
public void fun3() { }
public static void main(String[] args) {
// 這里只是定義了OverloadTest的實例,所以test不會調用
// OverloadTest1中的方法。
OverloadTest test = new OverloadTest1();
// 這里定義了OverloadTest1的實例,因為OverloadTest1是OverloadTest
// 的子類,所以test1會調用OverloadTest中的方法。
OverloadTest1 test1 = new OverloadTest1();
try {
int i = 1, j = 2, m = 3;
// 這里不會調用OverloadTest1的fun方法
// test.fun(i, m, j);
test1.fun(i, j, m);
test1.fun();
// 這個調用不會執行,因為fun3()在OverloadTest中訪問許可權是priavte
//test1.fun3();
test1.fun3(i);
} catch(Exception e) { }
}
}
class OverloadTest1 extends OverloadTest{
// 在子類中重載fun
public void fun(int i, int m, int n) {
System.out.println("Overload fun1 in OverloadTest1, parameter type: int, int, int");
}
// 這個不是對父類中方法的重載,只是一個新的方法。
public void fun3(int i) {
System.out.println("fun2 in OverloadTest1");
}
}
// 對override測試的文件:OverrideTest.java
public class OverrideTest {
public void fun() throws TestException {
System.out.println("method fun in OverrideTest");
}
private void fun1() {
System.out.println("method fun1 in OverrideTest");
}
public static void main(String[] args) {
OverrideTest test = new OverrideTest1();
try {
test.fun();
test.fun1();
} catch(Exception e) { }
}
}
class OverrideTest1 extends OverrideTest{
// 以下正常Override
public void fun() throws TestException2 {
System.out.println("fun in OverrideTest1");
}
// 不能Override父類中的方法,因為它定義了不同的異常類型和
// 返回值。
//public int fun() throws TestException1 {
// System.out.println("method fun in Test");
// return 1;
//}
// 不能Override父類中的方法,因為它拋出了比父類中非法范圍
// 更大的異常。
//public void fun() throws Exception {
// System.out.println("fun in OverrideTest1");
//}
// 這個方法並沒有Override父類中的fun1方法,因為這個方法在
// 父類是private類型,所以這里只是相當於定義了一個新方法。
public void fun1() {
System.out.println("method fun1 in Test");
}
}
class TestException extends Exception{
public TestException(String msg) {
super(msg);
}
}
class TestException1 extends TestException {
public TestException1(String msg) {
super(msg);
}
}
class TestException2 extends TestException {
public TestException2(String msg) {
super(msg);
}
}
『肆』 java 方法重寫會覆蓋原來的方法嗎
會。
當子類中的方法與父類中的方法具有相同的返回類型和簽名時,就稱子類中的方法重寫。
若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。 如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
ClassA{
Publicvoidshow(){
System.out.println(「顯示圖片」);
}
ClassBexstendsA{//B類是子類,繼承A類
Publicvoidshow(){
System.out.println(「顯示動態圖片」);
}//
我們就稱B類中的show方法重寫了A類中的show方法。
『伍』 Java中方法的重載和覆蓋怎麼區分
重載(overload):發生在一個類的內部,而且是針對方法而不是域而言。若方法的簽名相同,但參數的個數或者參數的類型不同,則構成了重載。但返回類型不在考慮范圍之內,也就是說,如果僅僅是返回類型不同,則構不成重載。 覆蓋(override):發生在父類和子類之間,而且是針對實例方法(即非靜態方法)而不是域而言。構成覆蓋要滿足以下條件:1、父類中的static方法不可以被覆蓋;2、父類中的final方法不可以被覆蓋;3、方法的簽名、參數個數以及參數類型都要相同; 對於返回類型要說明兩點: 1)如果返回類型是引用類型,則覆蓋方法的返回類型可以聲明為父類方法聲明的返回類型的子類型; 2)如果返回類型是基本類型,則覆蓋方法的返回類型必須和父類方法的返回類型相同;來源:( http://blog.sina.com.cn/s/blog_5c4532e50100bqbl.html) - Java中的重載、覆蓋和隱藏_村長_新浪博客 對於方法參數的說明:不管父類方法中的參數是否是final的,子類都可以修改這個參數;4、子類方法的訪問許可權要大於等於父類的訪問許可權;5、子類方法可以改變某些方法修飾符,如:synchronized、native和strictfp。6、子類方法的throws子句可以和父類方法不同,它列出的每一個異常類型都應該和父類中的異常類型相同或者是父類異常類型的子類; 隱藏(hidden):發生在父類與子類之間,而且只是針對靜態成員(靜態方法和靜態域)。說明:被聲明為final的類方法不可以被隱藏。 實例方法被子類的方法覆蓋時,實際被調用的方法是在執行時決定的。類方法被子類的方法隱藏時,實際被調用的方法是在編譯時決定的。