idea 查看一个类的子类_Java-05-多态、抽象类、接口和内部类
什么是多態(tài)
多態(tài)是指實(shí)例方法根據(jù)調(diào)用者會(huì)有不同的表現(xiàn),就像多種形態(tài)一樣。這里要注意的是:靜態(tài)方法沒有多態(tài)的說法。
可以看到,雖然都是 Person 類,但是 p1 是真正的 Person,而 p2 是 Person 的子類,子類中又 Override 了父類的方法,所以雖然看上去都是調(diào)用 sayHi 方法,但是有著不同的表現(xiàn),這就是多態(tài)的體現(xiàn)了。
什么是抽象類
抽象類的本質(zhì)仍然是個(gè)類,所以類可以有的東西,它也可以有,此外它還可以聲明抽象方法。
聲明抽象方法應(yīng)該要注意:
為什么要使用抽象類
先假設(shè)我們沒有抽象類,我們要實(shí)現(xiàn)一個(gè)需求:
有一個(gè) Person 類,他有 sayHi 方法,供子類使用,還有一個(gè) work 方法,由于不知道子類的具體實(shí)現(xiàn),所以留空。
那么我們會(huì)寫出這樣的代碼:
但是即使子類不重寫的話,編譯不會(huì)報(bào)錯(cuò),那如果我們改成抽象類的話,子類就必須實(shí)現(xiàn)。
所以抽象類就像是「模板方法」,它預(yù)留了幾個(gè)方法空位,讓子類自行實(shí)現(xiàn)。
什么是接口
如果一個(gè)抽象類中的方法都是抽象方法,那么就應(yīng)該可以把它聲明為接口。
接口中也可以包含成員,但是成員都是 public static final 的,即常量。
我們?cè)?IDEA 中寫的時(shí)候,會(huì)看到它顯示灰色,那么就表示我們不用顯式地聲明。
為什么要使用接口
我們都知道,Java 中的類只能繼承一個(gè)類。有時(shí)候我們會(huì)遇到一些非?!安煌瑢こ!钡男枨?#xff1a;
Java 中一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,所以彌補(bǔ)了這個(gè)短板。
但是接口有一個(gè)非常非常明顯的弊端:接口一旦發(fā)布,就無法更改了。
怎么理解這句話呢?比如 A 接口有 B、C、D 三個(gè)方法,那么我繼承了 A 接口并且實(shí)現(xiàn)了這些方法。假如有一天 A 接口要增加一個(gè) E 方法,如果我不跟著改動(dòng),那么我的代碼就報(bào)錯(cuò)了,因?yàn)閷?shí)現(xiàn)接口的時(shí)候必須要實(shí)現(xiàn)接口的所有抽象方法。
為了這個(gè)問題,Java8 引入了接口的默認(rèn)方法。但是在傳統(tǒng)的面向?qū)ο缶幊痰乃枷胫?#xff0c;接口應(yīng)該只包含抽象方法。
內(nèi)部類和靜態(tài)內(nèi)部類
內(nèi)部類是指我們?cè)陬愔杏侄x了一個(gè)類,一般是起到更好的封裝效果。
內(nèi)部類可以選擇是否用 static 修飾符來修飾,兩者的區(qū)別就是是否包含一個(gè)外部類的引用,非靜態(tài)內(nèi)部類是包含外部類的引用的,而靜態(tài)內(nèi)部類是不包含外部類的引用的。
我們推薦使用「靜態(tài)內(nèi)部類」,因?yàn)榭梢詼p少大小,如果編譯報(bào)錯(cuò),那么就去掉 static 修飾符。
總結(jié)
以上是生活随笔為你收集整理的idea 查看一个类的子类_Java-05-多态、抽象类、接口和内部类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 插上 u盘提示格式化怎么办啊 U盘插上提
- 下一篇: sql left join 去重_混入了