1、內部類
將一個類A定義在另一個類B裏面,裏面的那個類A就稱爲內部類,B則稱爲外部類。
1.1 成員內部類
定義在類中方法外的類。
定義格式:
class 外部類 {
class 內部類{
}
}
在描述事物時,若一個事物內部還包含其他事物,就可以使用內部類這種結構。比如,汽車類Car
中包含發動機類Engine
,這時,Engine
就可以使用內部類來描述,定義在成員位置。
代碼舉例:
class Car { //外部類
class Engine { //內部類
}
}
1.2 訪問特點
成員內部類可以直接訪問外部類的成員變量和成員方法。
外部類不可以直接訪問內部類的成員變量和成員方法。
外部類想要訪問內部的成員: 得創建內部類對象來訪問內部類成員。
外部類名.內部類名 對象名 = 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、匿名內部類
一個繼承了類的子類的匿名對象 或者一個實現了接口的實現類的匿名對象。
開發中,最常用到的內部類就是匿名內部類了。以接口舉例,當你使用一個接口時,似乎得做如下幾步操作。
1、定義子類
2、重寫接口中的方法
3、創建子類對象
4、調用重寫後的方法
我們的目的,最終只是爲了調用方法,那麼能不能簡化一下,把以上四步合成一步呢?匿名內部類就是做這樣的快捷方式。
條件
匿名內部類必須繼承一個父類或者實現一個父接口。
2.1 格式
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();
}
}
原文作者:一直千尋
原文地址:https://www.cnblogs.com/libinhong/p/10990602.html
(感謝原文作者的分享)
分享其他學習資料: