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