【內部類】【概念、分類、用法】

一、概念: 一個類是用來模擬一個事務的,如果一個事務的內部包含另一個事務,那麼這就是一個類內部包含另一個事務的。例如:身體和心臟,汽車和發動機。

二、分類

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出來的對象會在堆當中持續存在,直到垃圾回收消失,所以要保證局部變量始終不變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章