前言
在Java8中接口中不再只有抽象方法,還可以有靜態方法以及默認方法,此時的接口更像是一個類。我們一起來看看如何使用吧~
Java8中,可以為接口添加靜態方法和默認方法。
靜態方法:使用static關鍵字修飾。可以通過接口直接調用靜態方法,并執行其方法體
默認方法:使用default關鍵字修飾。可以通過類來調用
直接看代碼吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.nanfeng.demo.interfacepractice.java8; /** * java8中的新特性 * 在接口中默認方法的權限是public,所以public也可以省略 */ public interface CompareA { // 接口中可以定義抽象方法 public static void method1() { System.out.println( "Java8中接口中可以定義靜態方法,通過接口來調用--1" ); } // 默認方法 public default void method2() { System.out.println( "Java8中接口中可以定義默認方法--2" ); } public default void method3() { System.out.println( "Java8中接口中可以定義默認方法--3" ); } } |
編寫測試類ComepareTest
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
28
29
30
31
32
33
34
35
36
|
package com.nanfeng.demo.interfacepractice.java8; public class CompareATest { public static void main(String[] args) { // 創建實現類對象 CompareAClass c = new CompareAClass(); /** * 知識點一:接口中的靜態方法 只能通過接口來調用 * Static method may be invoked on containing interface class only * 靜態方法只能在包含接口類時調用 */ // c.method1(); // 使用接口調用method1()方法,此時的接口有點像工具類了 CompareA.method1(); /** * 知識點二: * 默認方法,可以通過創建實現類的對象來調用接口中的默認方法 * 或者也可以對接口中的默認方法進行重寫 */ c.method2(); } } class CompareAClass implements CompareA { /** * 在實現類中對接口中的默認方法進行重寫時 * 注意:不可以省略public權限修飾,否則會報錯 * 執行時,依然會調用我們重寫后的方法,符合繼承 * * */ @Override public void method2() { System.out.println( "Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略" ); } } |
運行結果:
Java8中接口中可以定義靜態方法,通過接口來調用
Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略--2
第一種情況,一個類實現了接口的同時又繼承了一個父類
1、創建實現類的父類
1
2
3
4
5
6
7
8
9
10
11
|
package com.nanfeng.demo.interfacepractice.java8; /** * 實現類的父類 */ public class SuperClass { // 定義與接口中同名的方法 public void method3(){ System.out.println( "實現類的父類中,出現和接口中同名同參數的方法--SuperClass" ); } } |
2、讓子類實現接口的同時繼承父類
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package com.nanfeng.demo.interfacepractice.java8; public class CompareATest { public static void main(String[] args) { // 創建實現類對象 CompareAClass c = new CompareAClass(); /** * 知識點一:接口中的靜態方法 只能通過接口來調用 * Static method may be invoked on containing interface class only * 靜態方法只能在包含接口類時調用 */ // c.method1(); // 使用接口調用method1()方法,此時的接口有點像工具類了 CompareA.method1(); /** * 知識點二: * 默認方法,可以通過創建實現類的對象來調用接口中的默認方法 * 或者也可以對接口中的默認方法進行重寫 */ c.method2(); /** * 知識點三: * 父類中的方法和接口中的方法同名時應該怎么處理? * 如果子類(或實現類)繼承的父類和實現的接口中聲明了同名同參的方法 * 那么在子類沒有重寫此方法時,默認的調用的是父類中同名同參的方法。 * -->類優先原則 */ c.method3(); } } class ComepareAClass extends SuperClass implements CompareA { /** * 在實現類中對接口中的默認方法進行重寫時 * 注意:不可以省略public權限修飾,否則會報錯 * 執行時,依然會調用我們重寫后的方法,符合繼承 */ @Override public void method2() { System.out.println( "Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略" ); } } |
運行查看結果:
Java8中接口中可以定義靜態方法,通過接口來調用--1
Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略--2
實現類的父類中,出現和接口中同名的方法--SuperClass
情況二
實現類在沒有繼承父類的前提下,對多個接口進行實現,應該如何處理
1、創建CompareB接口,創建和CompareA接口中通同參的默認方法
注意:如果一個類同時繼承多個接口,接口中出現同名同參的默認方法時,會出現接口沖突。此時,實現類必須重寫此方法
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
28
29
30
|
/** * Java接口中支持接口的多繼承 * 情況一: * class ComepareAClass extends SuperClass implements CompareA * CompareA接口和SuperClass父類出現同名同參的方法時,默認會調用父類中的方法,體現了類優先原則 * 情況二: * class ComepareAClass implements CompareA, CompareB * 在沒有繼承父類的前提下,一個類對多個接口繼承的前提下,兩個接口中定義了同名同參的默認方法,會如何執行? * 知識點四: * 如果一個實現類實現了多個接口,而這多個接口中定義了同名同參的默認方法,那么在實現類沒有重寫此方法的情況下,報錯 * -->會出現借口沖突 * 這就必須我們在實現類中重寫此方法 * */ class CompareAClass implements CompareA, CompareB { /** * 在實現類中對接口中的默認方法進行重寫時 * 注意:不可以省略public權限修飾,否則會報錯 * 執行時,依然會調用我們重寫后的方法,符合繼承 */ @Override public void method2() { System.out.println( "Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略--2" ); } // 解決接口沖突,必須對接口中的方法進行重寫 @Override public void method3() { System.out.println( "ComepareAClass實現類對多個接口中的同名方法進行重寫,重寫后執行的就是實現類中的方法--method3()" ); } } |
運行結果:
Java8中接口中可以定義靜態方法,通過接口來調用--1
Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略--2
ComepareAClass實現類對多個接口中的同名方法進行重寫,重寫后執行的就是實現類中的方法--method3()
情況三
在子類(或實現類)中自己定義的方法中,調用接口和父類中沒有被重寫的方法
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
/** * Java接口中支持接口的多繼承 * 情況一: * class ComepareAClass extends SuperClass implements CompareA * CompareA接口和SuperClass父類出現同名同參的方法時,默認會調用父類中的方法,體現了類優先原則 * 情況二: * class ComepareAClass implements CompareA, CompareB * 在沒有繼承父類的前提下,一個類對多個接口繼承的前提下,兩個接口中定義了同名同參的默認方法,會如何執行? * 知識點四: * 如果一個實現類實現了多個接口,而這多個接口中定義了同名同參的默認方法,那么在實現類沒有重寫此方法的情況下,報錯 * -->會出現借口沖突 * 這就必須我們在實現類中重寫此方法 * 情況三: * class CompareAClass extends SuperClass implements CompareA, CompareB * 一個子類(或實現類)繼承父類的同時實現多個接口 * 在子類(或實現類)中自己定義的方法中,調用接口和父類中沒有被重寫的方法 * */ class CompareAClass extends SuperClass implements CompareA, CompareB { /** * 在實現類中對接口中的默認方法進行重寫時 * 注意:不可以省略public權限修飾,否則會報錯 * 執行時,依然會調用我們重寫后的方法,符合繼承 */ @Override public void method2() { System.out.println( "Java8中實現類可以對接口中的默認方法進行重寫,注意聲明方法的權限修飾符為public,且public不可省略--2" ); } // 解決接口沖突,必須對接口中的方法進行重寫 @Override public void method3() { System.out.println( "ComepareAClass實現類對多個接口中的同名方法進行重寫,重寫后執行的就是實現類中的方法--method3()" ); } /** * 知識點五:如何在子類(或實現類)的方法中調用父類(或者接口中)沒有被重寫的方法 */ public void myMethod(){ // 調用自己重寫的method3()方法 this .method3(); // 調用父類中聲明的method3()方法 super .method3(); // 調接口中的默認方法(注意:是非靜態方法,所以不可以使用接口名調用) //調用方式:接口名.super.方法 CompareA. super .method3(); CompareB. super .method3(); } } |
總結
到此這篇關于Java8中接口新特性的文章就介紹到這了,更多相關Java8接口新特性內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/Robi_Candy/article/details/121046996