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