一、概念: 一個類是用來模擬一個事務的,如果一個事務的內部包含另一個事務,那麼這就是一個類內部包含另一個事務的。例如:身體和心臟,汽車和發動機。
二、分類
1、成員內部類
(1)定義
修飾符 class 外部類名稱{
修飾符 class 內部類名稱{
//...
}
}
(2)用法
內用外,隨意訪問;外用內,需要內部對象
public class Body { //外部類
public class Heart{ //內部類
public void methodHeart(){
System.out.println("內部類方法");
System.out.println(name); //內部類可訪問外部類成員方法
}
}
//外部類成員方法
private String name;
public void methodBody(){
System.out.println("外部類的方法");
}
}
如何使用成員內部類?
①、間接使用:在外部類的方法中,使用內部類,然後main調用外部類的方法。
public void methodBody(){
System.out.println("外部類的方法");
new Heart().methodHeart();
}
public class Demon01 {
public static void main(String[] args) {
Body body = new Body();//外部類對象
//通過調用外部類對象,調用外部類的方法,裏面間接使用內部類
body.methodBody();
}
}
②、直接訪問:套用公式
外部類名稱.內部類名稱 對象名 = new 外部類名稱().new 內部類名稱()
Body.Heart heart = new Body().new Heart();
heart.methodHeart();
(3)內部類的同名變量訪問
如果出現了重名現象,外部類的成員變量訪問格式:
外部類名稱.this.外部類成員變量名
public class Outer {
int num =10;//外部類的成員變量
public class Inner{
int num=20;//內部類的成員變量
public void methodInner(){
int num = 30;//內部類的局部變量
System.out.println(num);///30
System.out.println(this.num);//20
System.out.println(Outer.this.num);//10
}
}
}
2、局部內部類
(1)定義:一個類定義在方法內部。
修飾符 class 外部類名稱{
修飾符 返回值類型 外部類方法名(參數列表){
class 局部類名稱{
//...
}
}
}
(2)如何使用局部內部類?
“局部”:只有在當前所屬方法中才能使用它,出了這個方法外就不能使用了。
public class Outer1 {
public void methodOuter(){ //外部類方法
class Inner1{ //內部類
int num =10;
public void methodInner(){ //內部類方法
System.out.println(num);//10
}
}
Inner1 inner1 = new Inner1();
inner1.methodInner();
//調用內部類方法:必須在外部類方法中
}
}
public class Demon02 {
public static void main(String[] args) {
Outer1 outer1 = new Outer1();
outer1.methodOuter();
}
}
【類的權限修飾符】
public > protected > (default) > private
定義一個類的時候,權限修飾符規則:
1、外部類:public / (default)
2、成員內部類:public / protected / (default) / private
3、局部內部類:什麼都不能寫
(3)局部內部類的 final 問題
如果希望訪問所在外部類方法的局部變量,那麼這個局部變量必須是有效final的。
注意:從 Java8 開始,只要局部變量不變,可以省略 final 關鍵字。
【原因】
①、new 出來的對象在堆內存中
②、局部變量跟着方法一起走的,是在棧內存中
③、方法運行結束後,立刻出棧,局部變量會消失
④、但是new出來的對象會在堆當中持續存在,直到垃圾回收消失,所以要保證局部變量始終不變。