Java8中接口的新特性使用指南
前言
在Java8中接口中不再只有抽象方法,還可以有靜態(tài)方法以及默認(rèn)方法,此時(shí)的接口更像是一個(gè)類。我們一起來看看如何使用吧~
Java8中,可以為接口添加靜態(tài)方法和默認(rèn)方法。
靜態(tài)方法:使用static關(guān)鍵字修飾??梢酝ㄟ^接口直接調(diào)用靜態(tài)方法,并執(zhí)行其方法體
默認(rèn)方法:使用default關(guān)鍵字修飾??梢酝ㄟ^類來調(diào)用
直接看代碼吧
package com.nanfeng.demo.interfacepractice.java8;
/**
* java8中的新特性
* 在接口中默認(rèn)方法的權(quán)限是public,所以public也可以省略
*/
public interface CompareA {
// 接口中可以定義抽象方法
public static void method1() {
System.out.println("Java8中接口中可以定義靜態(tài)方法,通過接口來調(diào)用--1");
}
// 默認(rèn)方法
public default void method2() {
System.out.println("Java8中接口中可以定義默認(rèn)方法--2");
}
public default void method3() {
System.out.println("Java8中接口中可以定義默認(rèn)方法--3");
}
}
編寫測試類ComepareTest
package com.nanfeng.demo.interfacepractice.java8;
public class CompareATest {
public static void main(String[] args) {
// 創(chuàng)建實(shí)現(xiàn)類對象
CompareAClass c = new CompareAClass();
/**
* 知識點(diǎn)一:接口中的靜態(tài)方法 只能通過接口來調(diào)用
* Static method may be invoked on containing interface class only
* 靜態(tài)方法只能在包含接口類時(shí)調(diào)用 */
// c.method1();
// 使用接口調(diào)用method1()方法,此時(shí)的接口有點(diǎn)像工具類了
CompareA.method1();
/**
* 知識點(diǎn)二:
* 默認(rèn)方法,可以通過創(chuàng)建實(shí)現(xiàn)類的對象來調(diào)用接口中的默認(rèn)方法
* 或者也可以對接口中的默認(rèn)方法進(jìn)行重寫
*/
c.method2();
}
}
class CompareAClass implements CompareA {
/**
* 在實(shí)現(xiàn)類中對接口中的默認(rèn)方法進(jìn)行重寫時(shí)
* 注意:不可以省略public權(quán)限修飾,否則會(huì)報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會(huì)調(diào)用我們重寫后的方法,符合繼承
*
*
*/
@Override
public void method2() {
System.out.println("Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略");
}
}
運(yùn)行結(jié)果:
Java8中接口中可以定義靜態(tài)方法,通過接口來調(diào)用
Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略--2
第一種情況,一個(gè)類實(shí)現(xiàn)了接口的同時(shí)又繼承了一個(gè)父類
1、創(chuàng)建實(shí)現(xiàn)類的父類
package com.nanfeng.demo.interfacepractice.java8;
/**
* 實(shí)現(xiàn)類的父類
*/
public class SuperClass {
// 定義與接口中同名的方法
public void method3(){
System.out.println("實(shí)現(xiàn)類的父類中,出現(xiàn)和接口中同名同參數(shù)的方法--SuperClass");
}
}
2、讓子類實(shí)現(xiàn)接口的同時(shí)繼承父類
package com.nanfeng.demo.interfacepractice.java8;
public class CompareATest {
public static void main(String[] args) {
// 創(chuàng)建實(shí)現(xiàn)類對象
CompareAClass c = new CompareAClass();
/**
* 知識點(diǎn)一:接口中的靜態(tài)方法 只能通過接口來調(diào)用
* Static method may be invoked on containing interface class only
* 靜態(tài)方法只能在包含接口類時(shí)調(diào)用 */
// c.method1();
// 使用接口調(diào)用method1()方法,此時(shí)的接口有點(diǎn)像工具類了
CompareA.method1();
/**
* 知識點(diǎn)二:
* 默認(rèn)方法,可以通過創(chuàng)建實(shí)現(xiàn)類的對象來調(diào)用接口中的默認(rèn)方法
* 或者也可以對接口中的默認(rèn)方法進(jìn)行重寫
*/
c.method2();
/**
* 知識點(diǎn)三:
* 父類中的方法和接口中的方法同名時(shí)應(yīng)該怎么處理?
* 如果子類(或?qū)崿F(xiàn)類)繼承的父類和實(shí)現(xiàn)的接口中聲明了同名同參的方法
* 那么在子類沒有重寫此方法時(shí),默認(rèn)的調(diào)用的是父類中同名同參的方法。
* -->類優(yōu)先原則
*/
c.method3();
}
}
class ComepareAClass extends SuperClass implements CompareA {
/**
* 在實(shí)現(xiàn)類中對接口中的默認(rèn)方法進(jìn)行重寫時(shí)
* 注意:不可以省略public權(quán)限修飾,否則會(huì)報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會(huì)調(diào)用我們重寫后的方法,符合繼承
*/
@Override
public void method2() {
System.out.println("Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略");
}
}
運(yùn)行查看結(jié)果:
Java8中接口中可以定義靜態(tài)方法,通過接口來調(diào)用--1
Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略--2
實(shí)現(xiàn)類的父類中,出現(xiàn)和接口中同名的方法--SuperClass
情況二
實(shí)現(xiàn)類在沒有繼承父類的前提下,對多個(gè)接口進(jìn)行實(shí)現(xiàn),應(yīng)該如何處理
1、創(chuàng)建CompareB接口,創(chuàng)建和CompareA接口中通同參的默認(rèn)方法
注意:如果一個(gè)類同時(shí)繼承多個(gè)接口,接口中出現(xiàn)同名同參的默認(rèn)方法時(shí),會(huì)出現(xiàn)接口沖突。此時(shí),實(shí)現(xiàn)類必須重寫此方法
/**
* Java接口中支持接口的多繼承
* 情況一:
* class ComepareAClass extends SuperClass implements CompareA
* CompareA接口和SuperClass父類出現(xiàn)同名同參的方法時(shí),默認(rèn)會(huì)調(diào)用父類中的方法,體現(xiàn)了類優(yōu)先原則
* 情況二:
* class ComepareAClass implements CompareA, CompareB
* 在沒有繼承父類的前提下,一個(gè)類對多個(gè)接口繼承的前提下,兩個(gè)接口中定義了同名同參的默認(rèn)方法,會(huì)如何執(zhí)行?
* 知識點(diǎn)四:
* 如果一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了多個(gè)接口,而這多個(gè)接口中定義了同名同參的默認(rèn)方法,那么在實(shí)現(xiàn)類沒有重寫此方法的情況下,報(bào)錯(cuò)
* -->會(huì)出現(xiàn)借口沖突
* 這就必須我們在實(shí)現(xiàn)類中重寫此方法
*
*/
class CompareAClass implements CompareA, CompareB {
/**
* 在實(shí)現(xiàn)類中對接口中的默認(rèn)方法進(jìn)行重寫時(shí)
* 注意:不可以省略public權(quán)限修飾,否則會(huì)報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會(huì)調(diào)用我們重寫后的方法,符合繼承
*/
@Override
public void method2() {
System.out.println("Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略--2");
}
// 解決接口沖突,必須對接口中的方法進(jìn)行重寫
@Override
public void method3() {
System.out.println("ComepareAClass實(shí)現(xiàn)類對多個(gè)接口中的同名方法進(jìn)行重寫,重寫后執(zhí)行的就是實(shí)現(xiàn)類中的方法--method3()");
}
}
運(yùn)行結(jié)果:
Java8中接口中可以定義靜態(tài)方法,通過接口來調(diào)用--1
Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略--2
ComepareAClass實(shí)現(xiàn)類對多個(gè)接口中的同名方法進(jìn)行重寫,重寫后執(zhí)行的就是實(shí)現(xiàn)類中的方法--method3()
情況三
在子類(或?qū)崿F(xiàn)類)中自己定義的方法中,調(diào)用接口和父類中沒有被重寫的方法
/**
* Java接口中支持接口的多繼承
* 情況一:
* class ComepareAClass extends SuperClass implements CompareA
* CompareA接口和SuperClass父類出現(xiàn)同名同參的方法時(shí),默認(rèn)會(huì)調(diào)用父類中的方法,體現(xiàn)了類優(yōu)先原則
* 情況二:
* class ComepareAClass implements CompareA, CompareB
* 在沒有繼承父類的前提下,一個(gè)類對多個(gè)接口繼承的前提下,兩個(gè)接口中定義了同名同參的默認(rèn)方法,會(huì)如何執(zhí)行?
* 知識點(diǎn)四:
* 如果一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了多個(gè)接口,而這多個(gè)接口中定義了同名同參的默認(rèn)方法,那么在實(shí)現(xiàn)類沒有重寫此方法的情況下,報(bào)錯(cuò)
* -->會(huì)出現(xiàn)借口沖突
* 這就必須我們在實(shí)現(xiàn)類中重寫此方法
* 情況三:
* class CompareAClass extends SuperClass implements CompareA, CompareB
* 一個(gè)子類(或?qū)崿F(xiàn)類)繼承父類的同時(shí)實(shí)現(xiàn)多個(gè)接口
* 在子類(或?qū)崿F(xiàn)類)中自己定義的方法中,調(diào)用接口和父類中沒有被重寫的方法
* */
class CompareAClass extends SuperClass implements CompareA, CompareB {
/**
* 在實(shí)現(xiàn)類中對接口中的默認(rèn)方法進(jìn)行重寫時(shí)
* 注意:不可以省略public權(quán)限修飾,否則會(huì)報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會(huì)調(diào)用我們重寫后的方法,符合繼承
*/
@Override
public void method2() {
System.out.println("Java8中實(shí)現(xiàn)類可以對接口中的默認(rèn)方法進(jìn)行重寫,注意聲明方法的權(quán)限修飾符為public,且public不可省略--2");
}
// 解決接口沖突,必須對接口中的方法進(jìn)行重寫
@Override
public void method3() {
System.out.println("ComepareAClass實(shí)現(xiàn)類對多個(gè)接口中的同名方法進(jìn)行重寫,重寫后執(zhí)行的就是實(shí)現(xiàn)類中的方法--method3()");
}
/**
* 知識點(diǎn)五:如何在子類(或?qū)崿F(xiàn)類)的方法中調(diào)用父類(或者接口中)沒有被重寫的方法
*/
public void myMethod(){
// 調(diào)用自己重寫的method3()方法
this.method3();
// 調(diào)用父類中聲明的method3()方法
super.method3();
// 調(diào)接口中的默認(rèn)方法(注意:是非靜態(tài)方法,所以不可以使用接口名調(diào)用)
//調(diào)用方式:接口名.super.方法
CompareA.super.method3();
CompareB.super.method3();
}
}
總結(jié)
到此這篇關(guān)于Java8中接口新特性的文章就介紹到這了,更多相關(guān)Java8接口新特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Spring MVC獲取請求數(shù)據(jù)詳解操作
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級 Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì)。由于 Spring MVC 本身就是 Spring 框架的一部分,可以說和 Spring 框架是無縫集成2021-11-11
SpringMVC實(shí)現(xiàn)文件上傳和下載功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)文件上傳和下載功能 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
解決RedisTemplate調(diào)用increment報(bào)錯(cuò)問題
這篇文章主要介紹了解決RedisTemplate調(diào)用increment報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
java實(shí)現(xiàn)ssh連接服務(wù)器的方法步驟
本文主要介紹了java實(shí)現(xiàn)ssh連接服務(wù)器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
SpringBoot Jpa企業(yè)開發(fā)示例詳細(xì)講解
這篇文章主要介紹了SpringBoot Jpa企業(yè)開發(fā)示例,Jpa可以通過實(shí)體類生成數(shù)據(jù)庫的表,同時(shí)自帶很多增刪改查方法,大部分sql語句不需要我們自己寫,配置完成后直接調(diào)用方法即可,很方便2022-11-11
Spring通過工具類實(shí)現(xiàn)獲取容器中的Bean
在實(shí)際開發(fā)中,我們往往要用到Spring容器為我們提供的諸多資源,例如想要獲取到容器中的配置、獲取到容器中的Bean等等。本文為大家詳細(xì)講講工具類如何獲取到Spring容器中的Bean,需要的可以參考一下2022-06-06
啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問題及解決
這篇文章主要介紹了啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
ssm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)
下面小編就為大家?guī)硪黄猻sm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10

