Java日誌第21天 2020.7.26
阿新 • • 發佈:2020-07-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 voidmethod(){ 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(); } }
今天的內容需要理解,多練一練,明天還有一點內容,然後做一個綜合例項。