Java接口操作(繼承父類并實(shí)現(xiàn)多個(gè)接口)
/*
使用接口的時(shí)候,需要注意:
1. 接口是沒有靜態(tài)代碼塊或者構(gòu)造方法的。 2. 一個(gè)類的直接父類是唯一的,但是一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口。
格式:
public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
// 覆蓋重寫所有抽象方法
}
3. 如果實(shí)現(xiàn)類所實(shí)現(xiàn)的多個(gè)接口當(dāng)中,存在重復(fù)的抽象方法,那么只需要覆蓋重寫一次即可。
A接口
package cn.itcast.day10.demo02;
public interface MyInterfaceA {
// 錯(cuò)誤寫法!接口不能有靜態(tài)代碼塊
// static {
//
// }
// 錯(cuò)誤寫法!接口不能有構(gòu)造方法
// public MyInterfaceA() {
//
// }
public abstract void methodA();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默認(rèn)方法AAA");
}
}
B接口
package cn.itcast.day10.demo02;
public interface MyInterfaceB {
// 錯(cuò)誤寫法!接口不能有靜態(tài)代碼塊
// static {
//
// }
// 錯(cuò)誤寫法!接口不能有構(gòu)造方法
// public MyInterfaceA() {
//
// }
public abstract void methodB();
public abstract void methodAbs();
public default void methodDefault() {
System.out.println("默認(rèn)方法BBB");
}
}
實(shí)現(xiàn)類有多個(gè)接口
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("對(duì)多個(gè)接口當(dāng)中沖突的默認(rèn)方法進(jìn)行了覆蓋重寫");
}
}
只覆蓋重寫了一次。
4. 如果實(shí)現(xiàn)類沒有覆蓋重寫所有接口當(dāng)中的所有抽象方法,那么實(shí)現(xiàn)類就必須是一個(gè)抽象類。
package cn.itcast.day10.demo02;
public abstract class MyInterfaceAbstract implements MyInterfaceA, MyInterfaceB {
@Override
public void methodA() {
}
// 沒有寫methodB那么實(shí)現(xiàn)類是抽象類
@Override
public void methodAbs() {
}
@Override
public void methodDefault() {
}
}
抽象方法methodB沒有重寫覆蓋,那么實(shí)現(xiàn)類成為了抽象類。
5. 如果實(shí)現(xiàn)類鎖實(shí)現(xiàn)的多個(gè)接口當(dāng)中,存在重復(fù)的默認(rèn)方法,那么實(shí)現(xiàn)類一定要對(duì)沖突的默認(rèn)方法進(jìn)行覆蓋重寫(A,B兩個(gè)接口中都寫了默認(rèn)方法,沖突了)。見3.中實(shí)現(xiàn)類中覆蓋重寫了A,B中的兩個(gè)默認(rèn)方法
6. 一個(gè)類如果直接父類當(dāng)中的方法,和接口當(dāng)中的默認(rèn)方法產(chǎn)生了沖突,優(yōu)先用父類當(dāng)中的方法。
Fu類
package cn.itcast.day10.demo02;
public class Fu {
public void method() {
System.out.println("父類方法");
}
}
MyInterface接口
package cn.itcast.day10.demo02;
public interface MyInterface {
public default void method() {
System.out.println("接口的默認(rèn)方法");
}
}
直接父類當(dāng)中的方法,和接口當(dāng)中的默認(rèn)方法產(chǎn)生了沖突。
Zi子類
package cn.itcast.day10.demo02;
public class Zi extends Fu implements MyInterface {
}
調(diào)用method方法,看哪個(gè)優(yōu)先
package cn.itcast.day10.demo02;
public class Demo01Interface {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}
}
調(diào)用子類對(duì)象的method方法,發(fā)現(xiàn)使用的是父類中的而不是接口中的方法,父類的優(yōu)先級(jí)比接口優(yōu)先級(jí)更高。
運(yùn)行結(jié)果:
父類方法
Process finished with exit code 0
*/
補(bǔ)充知識(shí):java從對(duì)象開始(類,父類與繼承,抽象,接口)
1、對(duì)象(類class)
在程序設(shè)計(jì)時(shí),我們往往會(huì)接觸到各種形形色色的現(xiàn)實(shí)已存在的對(duì)象,這些對(duì)象都是需要我們?cè)诔绦蛑袑?shí)例化出來進(jìn)行業(yè)務(wù)操作的。不過從數(shù)量和復(fù)雜上講可以說比我們現(xiàn)實(shí)中接觸的事物是有過之而無不及的。
2、父類與繼承
當(dāng)對(duì)象類型繁雜數(shù)量繁多時(shí)我們就會(huì)像生物學(xué)上對(duì)各種生物進(jìn)行分門別類,對(duì)我們收集到的對(duì)象以屬性或者功能又或者其他標(biāo)準(zhǔn)進(jìn)行分類目。而這些我們最終分出來的各種類目往往在程序中被定義為父類,它是對(duì)我們收集到的對(duì)象中某些具有相同屬性或者功能又或者其他相似特征的對(duì)象集合的總稱。好似一個(gè)包含各種文件的文件夾,它本身在程序中并無任何業(yè)務(wù)操作的意義。
不過注意的是在不同情形不同問題域下,由于分類標(biāo)準(zhǔn)不同,父類也會(huì)成為某個(gè)父類的子類,所以會(huì)形成一種樹狀關(guān)系結(jié)構(gòu),父類在關(guān)系結(jié)構(gòu)中與其他對(duì)象類并無差別。
分類完成后,現(xiàn)在我們就可以以父類為標(biāo)準(zhǔn)來操作一類對(duì)象了。但這時(shí)我們對(duì)分類好的對(duì)象進(jìn)行實(shí)例化會(huì)發(fā)現(xiàn)那些相同的屬性功能或者其他相似特征都需要在其對(duì)象中重復(fù)編寫,像這種程度的分類并不是我們想要的。
于是,我們又給父類賦予新的功能,它不再是單純的對(duì)對(duì)象進(jìn)行分類了。我們提取出相同的屬性和功能特征放在父類中,讓我們需要操作的對(duì)象僅僅關(guān)注自己特有的屬性和功能特征,其余的屬性和功能特征都可通過繼承父類來擁有。這樣我們就解決了相同屬性功能重復(fù)編寫的問題,并且還能對(duì)共有屬性功能進(jìn)行規(guī)范化操作。
3、抽象類
因?yàn)楦割惒o任何業(yè)務(wù)操作意義,我們就對(duì)各種父類進(jìn)行管理為它們添加abstract關(guān)鍵詞,讓它們無法實(shí)例化,這樣就避免了實(shí)例化對(duì)象是不正確的或者某些人分不清具體要操作哪些對(duì)象而實(shí)例化父類的問題。因?yàn)檫@些父類無法實(shí)例化,所以我們把它們稱為——抽象類。通過這樣的設(shè)定我們就會(huì)在程序中以抽象類為節(jié)點(diǎn)形成各種層級(jí)關(guān)系。
于是我們樹狀關(guān)系機(jī)構(gòu)又變成了具有清晰層級(jí)關(guān)系的樹狀關(guān)系結(jié)構(gòu)。
4、小結(jié)
父類的提出是進(jìn)行歸類操作,那么繼承則是去重和規(guī)范化的操作,而抽象在此基礎(chǔ)上又進(jìn)行了關(guān)系的分層級(jí)和類對(duì)象實(shí)例化操作的規(guī)范。
5、接口
前面說我們對(duì)每個(gè)對(duì)象根據(jù)某種特征進(jìn)行分類了,但有時(shí)我們會(huì)因?yàn)槟承┨赜心康臉?biāo)準(zhǔn)不一樣,有時(shí)以屬性分類有時(shí)以功能分類,但有些對(duì)象可能擁有相同屬性不擁有相同功能,有些對(duì)象擁有相同功能不擁有相同屬性。這時(shí)我們就會(huì)把這些在父類中沒有的屬性或者功能但其他對(duì)象又有相識(shí)功能或?qū)傩詥为?dú)抽取出來作為接口來為這些對(duì)象服務(wù)。
從抽取相同屬性或者功能這點(diǎn)來看,接口實(shí)則是對(duì)我們已分類好具有清晰層級(jí)的樹狀關(guān)系結(jié)構(gòu)再次進(jìn)行一次去重復(fù)操作,從而我們的對(duì)象從具有清晰層級(jí)的樹狀關(guān)系結(jié)構(gòu)變成了更加靈活的網(wǎng)狀形結(jié)構(gòu)。
但是在提取父類分類時(shí)我們一般會(huì)以相同屬性來進(jìn)行分類,那么那些不同的功能會(huì)單獨(dú)提取到接口中,接口和抽象類相似的是都不會(huì)進(jìn)行具體方法功能的實(shí)現(xiàn),只是將相同的功能申明好進(jìn)行規(guī)范化操作。具體實(shí)現(xiàn)會(huì)具體到對(duì)象再進(jìn)行實(shí)現(xiàn)。
對(duì)象進(jìn)行去重再提取后那些因?yàn)樵诓煌割愔芯哂邢嗤δ艿膶?duì)象又以另外一種標(biāo)準(zhǔn)分類到某種接口中了。比如某某對(duì)象的某某功能和某某對(duì)象的某某功能都是來至于某某接口的。從而我們對(duì)對(duì)象進(jìn)行操作又多了一種標(biāo)準(zhǔn),可以通過判斷是否具有某種功能進(jìn)行篩選對(duì)象進(jìn)其操作。
6、總結(jié)
從功能點(diǎn)上看接口與(抽象和父類和繼承)的提出都是對(duì)我們程序中的對(duì)象進(jìn)行歸類操作,去除那些重復(fù)的代碼。并且在接口和抽象類中都是可以對(duì)某些屬性和方法功能進(jìn)行規(guī)范化約束,從而我們?cè)趯?duì)對(duì)象進(jìn)行業(yè)務(wù)操作中就更加便捷清晰。對(duì)象與對(duì)象的關(guān)系更加明朗。
以上這篇Java接口操作(繼承父類并實(shí)現(xiàn)多個(gè)接口)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Log4j2阻塞業(yè)務(wù)線程引發(fā)的思考
這篇文章主要介紹了基于Log4j2阻塞業(yè)務(wù)線程引發(fā)的思考,基于很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot整合MyBatis Plus實(shí)現(xiàn)基本CRUD與高級(jí)功能
Spring Boot是一款用于快速構(gòu)建Spring應(yīng)用程序的框架,而MyBatis Plus是MyBatis的增強(qiáng)工具,本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中整合MyBatis Plus,并展示其基本CRUD功能以及高級(jí)功能的實(shí)現(xiàn)方式,需要的朋友可以參考下2024-02-02
關(guān)于Mybatis-Plus?Update更新策略問題
這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java深入淺出掌握SpringBoot之MVC自動(dòng)配置原理篇
在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2021-10-10
如何在Netty中注解使用Service或者M(jìn)apper
這篇文章主要介紹了如何在Netty中注解使用Service或者M(jìn)apper,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot程序打包失敗(.jar中沒有主清單屬性)
在學(xué)習(xí)SpringBoot,打包SpringBoot程序后,在cmd運(yùn)行出現(xiàn)了 某某某.jar中沒有注清單屬性,本文就來介紹一下原因以及解決方法,感興趣的可以了解一下2023-06-06
2023最新版IDEA創(chuàng)建javaweb項(xiàng)目的詳細(xì)圖文教程
之前用的社區(qū)版IDEA無法部署JavaWeb項(xiàng)目,于是裝了一個(gè)最新版的IDEA,下面這篇文章主要給大家介紹了關(guān)于2023最新版IDEA創(chuàng)建javaweb項(xiàng)目的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06

