使用接口的時候,需要注意:
1. 接口是沒有靜態代碼塊或者構造方法的。 2. 一個類的直接父類是唯一的,但是一個類可以同時實現多個接口。
格式:
1
2
3
|
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB { // 覆蓋重寫所有抽象方法 } |
3. 如果實現類所實現的多個接口當中,存在重復的抽象方法,那么只需要覆蓋重寫一次即可。
A接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package cn.itcast.day10.demo02; public interface MyInterfaceA { // 錯誤寫法!接口不能有靜態代碼塊 // static { // // } // 錯誤寫法!接口不能有構造方法 // public MyInterfaceA() { // // } public abstract void methodA(); public abstract void methodAbs(); public default void methodDefault() { System.out.println( "默認方法AAA" ); } } |
B接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package cn.itcast.day10.demo02; public interface MyInterfaceB { // 錯誤寫法!接口不能有靜態代碼塊 // static { // // } // 錯誤寫法!接口不能有構造方法 // public MyInterfaceA() { // // } public abstract void methodB(); public abstract void methodAbs(); public default void methodDefault() { System.out.println( "默認方法BBB" ); } } |
實現類有多個接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package cn.itcast.day10.demo02; public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB { @Override public void methodA() { System.out.println( "覆蓋重寫了A方法" ); } @Override public void methodB() { System.out.println( "覆蓋重寫了B方法" ); } @Override public void methodAbs() { System.out.println( "覆蓋重寫了AB接口都有的抽象方法" ); } // A B 都有 覆蓋一次 @Override public void methodDefault() { System.out.println( "對多個接口當中沖突的默認方法進行了覆蓋重寫" ); } } |
只覆蓋重寫了一次。
4. 如果實現類沒有覆蓋重寫所有接口當中的所有抽象方法,那么實現類就必須是一個抽象類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package cn.itcast.day10.demo02; public abstract class MyInterfaceAbstract implements MyInterfaceA, MyInterfaceB { @Override public void methodA() { } // 沒有寫methodB那么實現類是抽象類 @Override public void methodAbs() { } @Override public void methodDefault() { } } |
抽象方法methodB沒有重寫覆蓋,那么實現類成為了抽象類。
5. 如果實現類鎖實現的多個接口當中,存在重復的默認方法,那么實現類一定要對沖突的默認方法進行覆蓋重寫(A,B兩個接口中都寫了默認方法,沖突了)。見3.中實現類中覆蓋重寫了A,B中的兩個默認方法
6. 一個類如果直接父類當中的方法,和接口當中的默認方法產生了沖突,優先用父類當中的方法。
Fu類
1
2
3
4
5
6
7
|
package cn.itcast.day10.demo02; public class Fu { public void method() { System.out.println( "父類方法" ); } } |
MyInterface接口
1
2
3
4
5
6
7
|
package cn.itcast.day10.demo02; public interface MyInterface { public default void method() { System.out.println( "接口的默認方法" ); } } |
直接父類當中的方法,和接口當中的默認方法產生了沖突。
Zi子類
1
2
3
|
package cn.itcast.day10.demo02; public class Zi extends Fu implements MyInterface { } |
調用method方法,看哪個優先
1
2
3
4
5
6
7
8
|
package cn.itcast.day10.demo02; public class Demo01Interface { public static void main(String[] args) { Zi zi = new Zi(); zi.method(); } } |
調用子類對象的method方法,發現使用的是父類中的而不是接口中的方法,父類的優先級比接口優先級更高。
運行結果:
父類方法
Process finished with exit code 0
*/
補充知識:java從對象開始(類,父類與繼承,抽象,接口)
1、對象(類class)
在程序設計時,我們往往會接觸到各種形形色色的現實已存在的對象,這些對象都是需要我們在程序中實例化出來進行業務操作的。不過從數量和復雜上講可以說比我們現實中接觸的事物是有過之而無不及的。
2、父類與繼承
當對象類型繁雜數量繁多時我們就會像生物學上對各種生物進行分門別類,對我們收集到的對象以屬性或者功能又或者其他標準進行分類目。而這些我們最終分出來的各種類目往往在程序中被定義為父類,它是對我們收集到的對象中某些具有相同屬性或者功能又或者其他相似特征的對象集合的總稱。好似一個包含各種文件的文件夾,它本身在程序中并無任何業務操作的意義。
不過注意的是在不同情形不同問題域下,由于分類標準不同,父類也會成為某個父類的子類,所以會形成一種樹狀關系結構,父類在關系結構中與其他對象類并無差別。
分類完成后,現在我們就可以以父類為標準來操作一類對象了。但這時我們對分類好的對象進行實例化會發現那些相同的屬性功能或者其他相似特征都需要在其對象中重復編寫,像這種程度的分類并不是我們想要的。
于是,我們又給父類賦予新的功能,它不再是單純的對對象進行分類了。我們提取出相同的屬性和功能特征放在父類中,讓我們需要操作的對象僅僅關注自己特有的屬性和功能特征,其余的屬性和功能特征都可通過繼承父類來擁有。這樣我們就解決了相同屬性功能重復編寫的問題,并且還能對共有屬性功能進行規范化操作。
3、抽象類
因為父類并無任何業務操作意義,我們就對各種父類進行管理為它們添加abstract關鍵詞,讓它們無法實例化,這樣就避免了實例化對象是不正確的或者某些人分不清具體要操作哪些對象而實例化父類的問題。因為這些父類無法實例化,所以我們把它們稱為——抽象類。通過這樣的設定我們就會在程序中以抽象類為節點形成各種層級關系。
于是我們樹狀關系機構又變成了具有清晰層級關系的樹狀關系結構。
4、小結
父類的提出是進行歸類操作,那么繼承則是去重和規范化的操作,而抽象在此基礎上又進行了關系的分層級和類對象實例化操作的規范。
5、接口
前面說我們對每個對象根據某種特征進行分類了,但有時我們會因為某些特有目的標準不一樣,有時以屬性分類有時以功能分類,但有些對象可能擁有相同屬性不擁有相同功能,有些對象擁有相同功能不擁有相同屬性。這時我們就會把這些在父類中沒有的屬性或者功能但其他對象又有相識功能或屬性單獨抽取出來作為接口來為這些對象服務。
從抽取相同屬性或者功能這點來看,接口實則是對我們已分類好具有清晰層級的樹狀關系結構再次進行一次去重復操作,從而我們的對象從具有清晰層級的樹狀關系結構變成了更加靈活的網狀形結構。
但是在提取父類分類時我們一般會以相同屬性來進行分類,那么那些不同的功能會單獨提取到接口中,接口和抽象類相似的是都不會進行具體方法功能的實現,只是將相同的功能申明好進行規范化操作。具體實現會具體到對象再進行實現。
對象進行去重再提取后那些因為在不同父類中具有相同功能的對象又以另外一種標準分類到某種接口中了。比如某某對象的某某功能和某某對象的某某功能都是來至于某某接口的。從而我們對對象進行操作又多了一種標準,可以通過判斷是否具有某種功能進行篩選對象進其操作。
6、總結
從功能點上看接口與(抽象和父類和繼承)的提出都是對我們程序中的對象進行歸類操作,去除那些重復的代碼。并且在接口和抽象類中都是可以對某些屬性和方法功能進行規范化約束,從而我們在對對象進行業務操作中就更加便捷清晰。對象與對象的關系更加明朗。
以上這篇Java接口操作(繼承父類并實現多個接口)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/Valentino112358/article/details/89035835