Java內(nèi)部類與匿名內(nèi)部類
一、內(nèi)部類
什么是內(nèi)部類
將一個(gè)類A定義在另一個(gè)類B里面,里面的那個(gè)類A就稱為內(nèi)部類,B則稱為外部類。
成員內(nèi)部類
成員內(nèi)部類 :定義在類中方法外的類。
定義格式:
class 外部類 {
class 內(nèi)部類{
}
}
在描述事物時(shí),若一個(gè)事物內(nèi)部還包含其他事物,就可以使用內(nèi)部類這種結(jié)構(gòu)。比如,電腦類Computer 中包含中央處理器類Cpu ,這時(shí), Cpu 就可以使用內(nèi)部類來描述,定義在成員位置。
代碼舉例:
class Computer { //外部類 class Cpu { //內(nèi)部類 } }
訪問特點(diǎn)
- 內(nèi)部類可以直接訪問外部類的成員,包括私有成員。
- 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對(duì)象。
創(chuàng)建內(nèi)部類對(duì)象格式:
外部類名.內(nèi)部類名 對(duì)象名 = new 外部類().new 內(nèi)部類();
訪問演示,代碼如下:
定義類:
public class Person { private boolean live = true; class Heart { public void jump() { // 直接訪問外部類成員 if (live) { System.out.println("心臟在跳動(dòng)??"); } else { System.out.println("心臟不跳了??"); } } } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } }
定義測(cè)試類:
public class InnerDemo { public static void main(String[] args) { // 創(chuàng)建外部類對(duì)象 Person p = new Person(); // 創(chuàng)建內(nèi)部類對(duì)象 Heart heart = p.new Heart(); // 調(diào)用內(nèi)部類方法 heart.jump(); // 調(diào)用外部類方法 p.setLive(false); // 調(diào)用內(nèi)部類方法 heart.jump(); } }
輸出結(jié)果:
心臟在跳動(dòng)??
心臟不跳了??
??內(nèi)部類仍然是一個(gè)獨(dú)立的類,在編譯之后會(huì)內(nèi)部類會(huì)被編譯成獨(dú)立的.class文件,但是前面冠以外部類的類名和$符號(hào) 。比如,Person$Heart.class
二、匿名內(nèi)部類
匿名內(nèi)部類 :是內(nèi)部類的簡(jiǎn)化寫法。它的本質(zhì)是一個(gè)帶具體實(shí)現(xiàn)的父類或者父接口的 匿名的 子類對(duì)象。開發(fā)中,最常用到的內(nèi)部類就是匿名內(nèi)部類了。以接口舉例,當(dāng)你使用一個(gè)接口時(shí),似乎得做如下幾步操作:
- 定義子類
- 重寫接口中的方法
- 創(chuàng)建子類對(duì)象
- 調(diào)用重寫后的方法
我們的目的,最終只是為了調(diào)用方法,那么能不能簡(jiǎn)化一下,把以上四步合成一步呢?匿名內(nèi)部類就是做這樣的快捷方式。
前提
匿名內(nèi)部類必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)父接口。
格式
new 父類名或者接口名(){ // 方法重寫 @Override public void method() { // 執(zhí)行語(yǔ)句 } };
使用方式
以接口為例,匿名內(nèi)部類的使用,代碼如下:
定義接口:
public abstract class FlyAble{ public abstract void fly(); }
創(chuàng)建匿名內(nèi)部類,并調(diào)用:
public class InnerDemo { public static void main(String[] args) { /** 1.等號(hào)右邊:是匿名內(nèi)部類,定義并創(chuàng)建該接口的子類對(duì)象 2.等號(hào)左邊:是多態(tài)賦值,接口類型引用指向子類對(duì)象 */ FlyAble f = new FlyAble(){ public void fly() { System.out.println("蕪湖,起飛??!??????"); } }; //調(diào)用 fly方法,執(zhí)行重寫后的方法 f.fly(); } }
通常在方法的形式參數(shù)是接口或者抽象類時(shí),也可以將匿名內(nèi)部類作為參數(shù)傳遞。
代碼如下:
public class InnerDemo2 { public static void main(String[] args) { /** 1.等號(hào)右邊:是匿名內(nèi)部類,定義并創(chuàng)建該接口的子類對(duì)象 2.等號(hào)左邊:是多態(tài)賦值,接口類型引用指向子類對(duì)象 */ FlyAble f = new FlyAble(){ public void fly() { System.out.println("蕪湖,起飛??!??????"); } }; // 將f傳遞給showFly方法中 showFly(f); } public static void showFly(FlyAble f) { f.fly(); } }
以上兩步,也可以簡(jiǎn)化為一步,代碼如下:
public class InnerDemo3 { public static void main(String[] args) { /** 創(chuàng)建匿名內(nèi)部類,直接傳遞給showFly(FlyAble f) */ showFly(new FlyAble(){ public void fly() { System.out.println("蕪湖,起飛?。??????"); } }); } public static void showFly(FlyAble f) { f.fly(); } }
執(zhí)行輸出如下:
蕪湖,起飛?。??????
到此這篇關(guān)于Java內(nèi)部類與匿名內(nèi)部類的文章就介紹到這了,更多相關(guān)Java匿名內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
@Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決
這篇文章主要介紹了@Transactional跟@DS動(dòng)態(tài)數(shù)據(jù)源注解沖突的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09關(guān)于mybatis3中幾個(gè)@Provider的使用方式
這篇文章主要介紹了關(guān)于mybatis3中幾個(gè)@Provider的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if)
這篇文章主要介紹了MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn)
本文主要介紹了SpringBoot 異步線程間數(shù)據(jù)傳遞的實(shí)現(xiàn),包括異步線程的基本概念、數(shù)據(jù)傳遞的方式、具體實(shí)現(xiàn)方式等,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例
定長(zhǎng)隊(duì)列是一種有限容量的隊(duì)列,對(duì)于某些應(yīng)用場(chǎng)景非常有用,本文主要介紹了java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02SpringBoot 簽到獎(jiǎng)勵(lì)實(shí)現(xiàn)方案的示例代碼
這篇文章主要介紹了SpringBoot 簽到獎(jiǎng)勵(lì)實(shí)現(xiàn)方案的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Java IO創(chuàng)建目錄和文件實(shí)例代碼
本篇文章給大家分享了Java IO創(chuàng)建目錄和文件的實(shí)例代碼,過程很簡(jiǎn)單,大家可以測(cè)試參考下。2018-02-02