目錄:
- 內部類概念
- 成員內部類
- 靜態內部類
- 局部內部類
- 匿名內部類
1.內部類概念:
什麼是內部類?
把A類定義在B類中,那麼A類就是內部類(類中類),B類就是外部類。
必須有外部類內部類才能生存
2.成員內部類:
在類中方法外的類
成員內部類的使用:
1.創建外部類對象
2.根據外部類對象創建內部類對象
成員內部類的好處:
可以直接使用外部類的成員
代碼演示:
public class Body { // 外部類
boolean isLive = true;
public void walk() {
System.out.println("人在走路");
}
// 成員內部類
class Heart { // 內部類
String color = "黑色";
public void jump() {
if (isLive) {
System.out.println("心臟跳動一下");
walk();
} else {
System.out.println("心臟停止了跳動,涼涼!");
}
}
}
}
測試類:
public class Demo05 {
// 類中方法外,就是成員位置
int a; // 成員變量
public void test() { // 成員變量
}
public static void main(String[] args) {
// 1.創建外部類對象
Body b = new Body();
// 2.根據外部類對象創建內部類對象
Body.Heart h = b.new Heart();
h.jump();
b.isLive = false;
h.jump();
// 內部類創建方式二: 不推薦,只能找到內部類對象
Body.Heart hh = new Body().new Heart();
}
}
3.靜態內部類:
什麼是靜態內部類:
由static修飾的成員內部類
靜態內部類的創建格式:
外部類名.內部類名 變量名 = new 外部類名.內部類名();
靜態內部類只能使用外部類的?
只能使用外部類static修飾的成員變量和成成員方法
靜態內部類可以直接訪問外部類的靜態成員。
代碼演示:
// 身體
public class Body { // 外部類
static boolean isLive = true;
public static void walk() {
System.out.println("人在走路");
}
// 成員內部類
static class Heart { // 內部類
String color = "黑色";
public void jump() {
if (isLive) {
System.out.println("心臟跳動一下");
walk();
} else {
System.out.println("心臟停止了跳動,涼涼!");
}
}
}
}
測試類:
public static void main(String[] args) {
// 外部類名.內部類名 變量名 = new 外部類名.內部類名();
Body.Heart h = new Body.Heart();
h.jump();
}
}
4. 局部內部類
什麼是局部內部類:
局部顧名思義就是,定義在方法中的類
局部內部類的使用:
在定義局部內部類的下面馬上使用
局部內部類的好處:
可以直接使用外部類的成員
public class Chinese {
String color = "黃色";
public void eat() {
// 在方法中的類,局部內部類
class Chopsticks {
int length = 80;
public void use() {
System.out.println(color + "顏色的人使用長度爲: " + length + "的筷子吃飯");
}
}
// 在定義局部內部類的下面立馬使用
Chopsticks c = new Chopsticks();
c.use();
}
}
5.匿名內部類:
什麼是匿名內部類:
沒有名字的內部類
內部類的前提:
匿名內部類必須繼承一個父類或者父接口
匿名內部類的格式:
new 接口或者類() {
重寫方法;
}.方法名();
匿名內部類的本質:
四合一
- 定義一個沒有名字的類
- 這個沒有名字的類實現了前面的接口
- 創建了這個沒有名字的類的對象
- 對象調用了方法
匿名內部類的好處:
可以簡化接口的使用,代碼更少(不需要有實現類),四合一
匿名內部類的缺點:
匿名內部類沒有名字,只能使用一次
代碼演示:
// 定義一個抽菸接口
public interface Smokeable {
public abstract void smoking();
}
// 1.定義類實現接口
public class Student implements Smokeable {
// 2.重寫抽象方法
@Override
public void smoking() {
System.out.println("學生瀟灑的抽菸.");
}
}
public class Demo09 {
public static void main(String[] args) {
// 3.創建實現類對象
Student s = new Student();
// Student s1 = new Student();
// Student s2 = new Student();
// Student s3 = new Student();
// Student s4 = new Student();
s.smoking();
s.smoking();
// 使用匿名內部類
new Smokeable() {
@Override
public void smoking() {
System.out.println("寂寞的抽菸...");
}
}.smoking();
// 如果需要多次調用方法,需要保存這個匿名內部類創建的對象
// 接口名 變量名 = new 實現類(); 多態
Smokeable sm = new Smokeable() {
@Override
public void smoking() {
System.out.println("站着抽菸");
}
};
sm.smoking();
sm.smoking();
sm.smoking();
}
}