Java學習總結(六) —— 内部類
- 一、内部類
-
- 1. 概述
- 2. 内部類的通路
- 二、匿名内部類
-
- 1. 基本使用方法
- 2. 作為參數傳遞
一、内部類
1. 概述
将一個類A定義在另一個類B裡面,裡面的那個類A就稱為 内部類 ,B則稱為外部類。
代碼如下:
public class A{
class B{
}
}
2. 内部類的通路
- 1.内部類可以直接通路外部類的成員,包括私有成員。
- 2.外部類要通路内部類的成員,必須要建立内部類的對象。
代碼如下:
class Animal {
private boolean CAT = true;
// 内部類
class Cat {
public void isCat() {
// 内部類可以直接通路外部類的成員變量
if (CAT) {
System.out.println("喵喵喵");
} else {
System.out.println("汪汪汪");
}
}
}
public void changeToCat() {
this.CAT = true;
}
public void changeToDog() {
this.CAT = false;
}
}
// 測試類
class Test01 {
public static void main(String[] args) {
// 建立外部類對象
Animal animal = new Animal();
// 建立内部類對象
Animal.Cat Jim = animal.new Cat();
// 調用内部方法
Jim.isCat();
// 調用外部方法
animal.changeToDog();
// 調用内部方法
Jim.isCat();
}
}
輸出結果:
喵喵喵
汪汪汪
重點:
- 内部類仍然是一個獨立的類,在編譯之後會内部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符号 。
- 比如,Animal$Cat.class
二、匿名内部類
匿名内部類:是内部類的簡化格式,匿名内部類的本質是一個 帶着具體實作的父類或父接口的匿名的 子類對象。
傳統實作接口的步驟為:
- 1.建立接口
- 2.定義子類
- 3.重寫接口的方法
- 4.建立子類對象
- 5.調用重寫後的方法
是以針對以上繁瑣的步驟,提出了匿名内部類來簡化開發的步驟。
【前提】匿名内部類必須繼承一個父類或者實作一個父接口。
代碼如下:
new 父類名或者接口名(){
// 方法重寫
@Override
public void method() {
// 執行語句
}
};
1. 基本使用方法
舉個例子,代碼如下:
abstract class Fruit {
public abstract void eat();
}
class InnerDemo {
public static void main(String[] args) {
/*
1.等号右邊:是匿名内部類,定義并建立該接口的子類對象
2.等号左邊:是多态指派,接口類型引用指向子類對象
*/
Fruit fruit = new Fruit() {
@Override
public void eat() {
System.out.println("甜滋滋的");
}
};
fruit.eat();
}
}
輸出結果:
甜滋滋的
2. 作為參數傳遞
另一種使用方法是将匿名内部類作為參數傳遞,通常在方法的形式參數是接口或者抽象類時使用。
代碼如下:
abstract class Fruit {
public abstract void eat();
}
class InnerDemo {
public static void main(String[] args) {
show(new Fruit() {
@Override
public void eat() {
System.out.println("甜滋滋的");
}
});
}
public static void show(Fruit fruit) {
fruit.eat();
}
}
輸出結果:
甜滋滋的