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)限修飾,否則會報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會調(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)限修飾,否則會報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會調(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í),會出現(xiàn)接口沖突。此時(shí),實(shí)現(xiàn)類必須重寫此方法
/**
* Java接口中支持接口的多繼承
* 情況一:
* class ComepareAClass extends SuperClass implements CompareA
* CompareA接口和SuperClass父類出現(xiàn)同名同參的方法時(shí),默認(rèn)會調(diào)用父類中的方法,體現(xiàn)了類優(yōu)先原則
* 情況二:
* class ComepareAClass implements CompareA, CompareB
* 在沒有繼承父類的前提下,一個(gè)類對多個(gè)接口繼承的前提下,兩個(gè)接口中定義了同名同參的默認(rèn)方法,會如何執(zhí)行?
* 知識點(diǎn)四:
* 如果一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了多個(gè)接口,而這多個(gè)接口中定義了同名同參的默認(rèn)方法,那么在實(shí)現(xiàn)類沒有重寫此方法的情況下,報(bào)錯(cuò)
* -->會出現(xiàn)借口沖突
* 這就必須我們在實(shí)現(xiàn)類中重寫此方法
*
*/
class CompareAClass implements CompareA, CompareB {
/**
* 在實(shí)現(xiàn)類中對接口中的默認(rèn)方法進(jìn)行重寫時(shí)
* 注意:不可以省略public權(quán)限修飾,否則會報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會調(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)會調(diào)用父類中的方法,體現(xiàn)了類優(yōu)先原則
* 情況二:
* class ComepareAClass implements CompareA, CompareB
* 在沒有繼承父類的前提下,一個(gè)類對多個(gè)接口繼承的前提下,兩個(gè)接口中定義了同名同參的默認(rèn)方法,會如何執(zhí)行?
* 知識點(diǎn)四:
* 如果一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)了多個(gè)接口,而這多個(gè)接口中定義了同名同參的默認(rèn)方法,那么在實(shí)現(xiàn)類沒有重寫此方法的情況下,報(bào)錯(cuò)
* -->會出現(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)限修飾,否則會報(bào)錯(cuò)
* 執(zhí)行時(shí),依然會調(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)文章
聊聊SpringBoot使用Nacos進(jìn)行服務(wù)注冊發(fā)現(xiàn)與配置管理問題
Nacos支持基于DNS和基于RPC的服務(wù)發(fā)現(xiàn)(可以作為springcloud的注冊中心)、動態(tài)配置服務(wù)(可以做配置中心)、動態(tài)?DNS?服務(wù)。本文重點(diǎn)給大家介紹SpringBoot使用Nacos進(jìn)行服務(wù)注冊發(fā)現(xiàn)與配置管理,感興趣的朋友一起看看吧2022-01-01
springboot整合企微webhook機(jī)器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機(jī)器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Spring Boot Mysql 數(shù)據(jù)庫操作示例
本篇文章主要介紹了Spring Boot Mysql 數(shù)據(jù)庫操作示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
本文給大家分享的是一則使用java編寫的文件管理器的代碼,新人練手的作品,邏輯上還是有點(diǎn)小問題,大家?guī)兔纯窗伞?/div> 2015-04-04
Java中@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案
本文主要介紹了@DS+@Transactional注解切換數(shù)據(jù)源失效解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
JavaWeb ServletContext基礎(chǔ)與應(yīng)用詳細(xì)講解
ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個(gè)Web應(yīng)用里面可以有多個(gè)servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了2023-01-01最新評論

