方法重寫與之前的方法重載不同
回顧一下方法重載,相同的方法名不同參數(shù)類型和參數(shù)數(shù)量以及參數(shù)順序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package Demo1; import java.util.Arrays; public class Demo011 { public static void main(String[] args) { Demo011 D11= new Demo011(); D11.demo( 12 , 232 , 43 , 3 ); //4個實際參數(shù),則調(diào)用第三個demo方法 } public void demo( int a, int b){ System.out.println(a+b); } public void demo( int a, int b, int c){ System.out.println(a+b+c); } public void demo( int ...ints){ System.out.println(Arrays.toString(ints)); } } |
方法重寫
重寫都是方法的重寫與屬性無關(guān)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package Demo1; public class Demo012 { public static void main(String[] args) { B b = new B(); b.demo(); } } class A{ public static void demo(){ System.out.println( "Ademo" ); } } class B extends A{ public static void demo(){ System.out.println( "Bdemo" ); } } |
執(zhí)行結(jié)果:
Bdemo
父類的引用指向子類進(jìn)行引用
1
2
3
4
5
6
7
8
|
public static void main(String[] args) { //方法的調(diào)用只和數(shù)據(jù)類型有關(guān) B b = new B(); //調(diào)用的是B類的靜態(tài)方法 b.demo(); //父類的引用指向子類 A a = new A(); //調(diào)用的是A類的靜態(tài)方法 a.demo(); } |
執(zhí)行結(jié)果:
Bdemo
Ademo
使用快捷鍵Alt+insert快速生成重寫方法
Override重寫方法
1
2
3
4
5
6
7
8
9
10
11
|
class A{ public void demo(){ System.out.println( "Ademo" ); } } class B extends A{ @Override //注解,有功能的注釋 public void demo() { super .demo(); //默認(rèn)調(diào)用父類的demo()方法 } } |
使用Override重寫默認(rèn)是調(diào)用父類的方法,我們可以在重寫方法中調(diào)用自己的方法
1
2
3
4
5
6
7
8
9
10
11
12
|
class A{ public void demo(){ System.out.println( "Ademo" ); } } class B extends A{ @Override public void demo() { //super.demo(); 默認(rèn)調(diào)用父類的demo()方法輸出Ademo System.out.println( "Bdemo" ); } } |
重寫之后執(zhí)行結(jié)果:
Bdemo
Bdemo
子類重寫父類的demo()方法之后輸出為demoB,但是并不是子類重寫之后將父類的方法修改了,子類在進(jìn)行調(diào)用的時候調(diào)用的是重寫后父類的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package Demo3; public class demo005 { public static void main(String[] args) { DemoB DB = new DemoB(); DB.demo(); //調(diào)用子類的demo DemoA DA= new DemoA(); //調(diào)用父類的demo DA.demo(); } } class DemoA{ public void demo(){ System.out.println( "demoA" ); } } class DemoB extends DemoA{ //繼承 @Override public void demo(){ System.out.println( "demoB" ); } } |
執(zhí)行結(jié)果:
demoB
demoA
但是我可以完全不繼承父類也能輸出demoB,demoA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package Demo3; public class demo005 { public static void main(String[] args) { DemoB DB = new DemoB(); DB.demo(); DemoA DA= new DemoA(); DA.demo(); } } class DemoA{ public void demo(){ System.out.println( "demoA" ); } } class DemoB{ //A與B沒有繼承關(guān)系 public void demo(){ System.out.println( "demoB" ); } } |
執(zhí)行結(jié)果:
demoB
demoA
兩種方式有什么區(qū)別呢?
- 子類繼承父類重寫方法,是通過子類調(diào)用父類的方法進(jìn)行重寫的,子類執(zhí)行結(jié)果也是重寫后的方法,但并不是子類把父類的方法修改了
- 方式二是在兩個不同類下創(chuàng)建demo()方法,通過對象進(jìn)行調(diào)用。
父類方法若添加static修飾符則重寫失敗提示錯誤
進(jìn)行方法重寫時靜態(tài)方法和非靜態(tài)方法的區(qū)別很大,如果是加了static靜態(tài)方法,調(diào)用結(jié)果之和左邊定義的類有關(guān)。方法重寫與非靜態(tài)方法有關(guān)
私有方法無法進(jìn)行方法重寫,重寫的關(guān)鍵詞只能是public不能是private私有的
重寫小結(jié):
- 方法重寫需要有繼承關(guān)系,子類重寫父類的方法
- 子類方法與父類的方法方法名和修飾符必須相同
- 以及方法的參數(shù)列表必須相同,不相同則為方法重載
- 修飾符范圍可以擴(kuò)大但是不能縮小,private(小)–>proteated–>default–>public(大)
- 重寫可能會拋出異常,異常范圍可以被縮小但不能擴(kuò)大
為什么需要重寫?
- 父類的功能子類不一定需要或者不一定滿足,父類的東西太多了子類可能只需要一點
快捷鍵Alt+insert
快速創(chuàng)建Override
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!
原文鏈接:https://blog.csdn.net/xuzhibin666/article/details/119487908