成員內部類
定義在類中方法外的類。
定義格式:
class 外部類 { class 內部類{ } }
代碼舉例:
class Car { //外部類 class Engine { //內部類 } }
成員內部類可以直接訪問外部類的成員變量和成員方法
外部類不可以直接訪問內部類的成員變量和成員方法
外部類想要訪問內部的成員: 得創建內部類對象來訪問內部類成員
外部類名.內部類名 對象名 = new 外部類名().new 內部類名();
訪問演示,代碼如下:
定義類:
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) { // 創建外部類對象 Person p = new Person(); // 創建內部類對象 Heart heart = p.new Heart(); // 調用內部類方法 heart.jump(); // 調用外部類方法 p.setLive(false); // 調用內部類方法 heart.jump(); } } 輸出結果: 心臟在跳動 心臟不跳了
一個繼承了類的子類的匿名對象 或者一個實現了接口的實現類的匿名對象。
開發中,最常用到的內部類就是匿名內部類了。以接口舉例,當你使用一個接口時,似乎得做如下幾步操作。
2、重寫接口中的方法
3、創建子類對象
4、調用重寫后的方法
我們的目的,最終只是為了調用方法,那么能不能簡化一下,把以上四步合成一步呢?匿名內部類就是做這樣的快捷方式。
條件
匿名內部類必須繼承一個父類或者實現一個父接口。
new 父類名或者接口名(){ // 方法重寫 @Override public void method() { // 執行語句 } };
定義接口:
public abstract class FlyAble{ public abstract void fly(); }
創建匿名內部類,並調用:
public class InnerDemo { public static void main(String[] args) { /* 1.等號右邊:是匿名內部類,定義並創建該接口的子類對象 2.等號左邊:是多態賦值,接口類型引用指向子類對象 */ FlyAble f = new FlyAble(){ public void fly() { System.out.println("我飛了~~~"); } }; //調用 fly方法,執行重寫后的方法 f.fly(); } }
通常在方法的形式參數是接口或者抽象類時,也可以將匿名內部類作為參數傳遞。代碼如下:
public class InnerDemo2 { public static void main(String[] args) { /* 1.等號右邊:定義並創建該接口的子類對象 2.等號左邊:是多態,接口類型引用指向子類對象 */ 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) { /* 創建匿名內部類,直接傳遞給showFly(FlyAble f) */ showFly( new FlyAble(){ public void fly() { System.out.println("我飛了~~~"); } }); } public static void showFly(FlyAble f) { f.fly(); } }