1. 程式人生 > 實用技巧 >Java日誌第21天 2020.7.26

Java日誌第21天 2020.7.26

內部類

如果一個事物包含另一個事物,這就是一個類內部包含另一個類。

如身體與心臟、汽車與發動機

內部類中包括成員內部類與區域性內部類,其中區域性內部類中又包含匿名內部類

成員內部類

格式:

修飾符 class 外部類名稱{

  修飾符 class 內部類名稱{

    // ...

  }

  // ...

}

內部類用外部類時,可以隨意訪問;外部類用內部類時,需要用內部類的物件。

兩種使用成員內部類的方法

1.間接方法:在外部類方法中使用內部類,main方法直接呼叫外部類方法。

public class Body {//外部類

    public class Heart{//內部類

        
//內部類方法 public void beat(){ System.out.println("心臟跳動"); } } //外部類方法中使用內部類 public void methodBody(){ Heart heart = new Heart(); heart.beat(); } }

2.直接方法:

類名稱 物件名 = new 類名稱

外部類名稱.內部類名稱 物件名 = new 外部類名稱().new 內部類名稱()

public class DemoMain {
public static void main(String[] args) {

Body body = new Body();
body.methodBody();

Body.Heart heart = new Body().new Heart();
heart.beat();
}
}

當存在重名變數時,訪問如下:

public class Outer {
    
    private int num = 10;
    
    public class Inner{
        private int num = 20;
        
        public void
method(){ int num = 30; System.out.println(num);//30 System.out.println(this.num);//20 System.out.println(Outer.this.num);//10 } } }

*內部類的.class檔案命名是 外部類名稱$內部類名稱.class,所以不建議命名類名稱時使用$符號

區域性內部類

如果一個類是定義在一個方法內部的,那麼這就是一個區域性內部類。

只有當前所屬方法可以使用它,出了這個方法就不能使用。

格式:

修飾符 class 外部類名稱{

  修飾符 返回值型別 方法名稱(引數列表){

    class 內部類名稱{

    }

    // 方法體

  }

}

public class Outer {

    private int num = 10;

    public void method(){
        /*final*/ int num = 20;
        class Inner{
            public void getNum(){
                System.out.println(num);
            }
        }
    }
}

區域性內部類如果希望訪問所在方法的區域性變數,那麼這個區域性變數必須是有效final的。

從Java 8 開始,只要區域性變數事實不變,那麼final關鍵字可以省略。

匿名內部類

如果介面的實現類(或者父類的子類)只需要使用唯一一次,那麼這種情況下就可以省略掉該實現類的定義,而使用匿名內部類。

格式:

介面名稱 物件名 = new 介面歐名稱{

  //覆蓋重寫所有抽象方法

}

public interface MyInterface {

    public abstract void method();

}
public class DemoMain {
    public static void main(String[] args) {

        MyInterface obj1 = new MyInterface() {
            @Override
            public void method() {
                System.out.println("物件呼叫匿名內部類中的方法");
            }
        };
        obj1.method();
        
        new MyInterface() {
            @Override
            public void method() {
                System.out.println("匿名物件呼叫匿名內部類中的方法");
            }
        }.method();
    }
}

今天的內容需要理解,多練一練,明天還有一點內容,然後做一個綜合例項。