標籤:成員內部類 匿名內部類 靜態內部類 局部內部類
成員內部類
/* * 內部類 * 定義在另一個類中的類,稱為內部類Inner Class * 包含內部類的類,稱為外部類Outer Class * * 應用場合:在表單程式中進行事件處理 * * 分類: * 成員內部類 * 局部內部類 * 靜態內部類 * 匿名內部類 * * 成員內部類 * 1.在外部類中訪問內部類,可以訪問內部類中的所有成員,包含private修飾的 * 2.在外部類外訪問內部類,不能訪問內部類中的private修飾的成員 * 3.在內部類中訪問外部類,直接存取,如果內部類和外部類的變數名相同,可使用“外部類.this.變數” */public class Test12 { public static void main(String[] args) { Outer out=new Outer();//建立外部類的對象 /*out.print();//調用外部類的方法*/ //2.在外部類外訪問內部類 //在外部類的外部建立內部類的對象,文法:外部類.內部類 對象名=外部類對象.new 內部類(); //Outer.Inner in=out.new Inner(); //必須先建立外部類的對象 Inner in=out.new Inner(); //System.out.println(in.age);//無法訪問內部類的private成員 in.show(); }}/* * 外部類Outer,內部類Inner * 編譯後,會產生三個位元組碼檔案:Test12.class、Outer.class、Outer$Inner.class * 成員內部類名稱:外部類名$內部類名.class */class Outer{ //外部類 private String name="tom";//外部類的成員變數 static String address="南京"; class Inner{ //內部類 private int age=20;//內部類中的成員變數 private String name="張三"; String address="北京"; public void show(){ String address="天津"; System.out.println("內部類中的show方法"); //3.在內部類中訪問外部類 System.out.println("內部類中的name:"+this.name); System.out.println("外部類中的name:"+Outer.this.name); System.out.println("內部類中的age:"+age); System.out.println("內部類中的address:"+this.address); System.out.println("外部類中的address:"+Outer.address); System.out.println("內部類中的局部變數address:"+address); } } //1.在外部類中訪問內部類 public void print(){ System.out.println("外部類中的print方法"); Inner in=new Inner();//直接建立內部類的對象 System.out.println(in.age);//訪問內部類的屬性,可以訪問private成員 in.show(); }}
局部內部類
/* * 局部內部類 * 也稱為方法內部類,即定義在外部類的方法中的類 * 1.存取範圍:只能在外部類的方法中使用,不能使用修飾符進行修飾 * 2.在局部內部類中不能訪問外部類的方法中非final修飾的成員 */public class Test01 { public static void main(String[] args) { MOuter out=new MOuter(); out.show(); }}class MOuter{ String name="tom"; public void show(){ final int age=20; System.out.println("外部類中的show方法"); class MInner{ //局部內部類 String sex="male"; private String address="南京"; public void print(){ System.out.println("局部內部類中的print方法"); System.out.println("外部類中的成員變數name:"+name); System.out.println("外部類中局部變數age:"+age); } } //只能在外部類的方法中使用 MInner in=new MInner(); System.out.println(in.sex); System.out.println(in.address); in.print(); }}
靜態內部類
/* * 靜態內部類 * 使用static修飾的成員內部類 * 不能訪問外部類中非static成員 */public class Test02 { public static void main(String[] args) { //建立靜態內部類,無需建立外部類的對象 SInner in=new SInner(); in.show(); }}class SOuter{ static String name="tom"; static class SInner{ //靜態內部類 String sex="male"; public void show(){ System.out.println("靜態內部類中的show方法"); System.out.println("外部類中的name:"+name); } }}
匿名內部類
/* * 匿名內部類 * 即沒有名字的內部類,因為此類只需要使用一次,所以沒有起名字的必要 * 1.在建立匿名內部類時,必須作為new語句的一部分來聲明,用法: * 介面|抽象類別 對象名 = new 介面|抽象類別{ * //匿名內部類 * } * 2.在建立匿名內部類時,會自動建立一個匿名內部類的對象,並賦給變數 */public class Test03 { public static void main(String[] args) { Service s=new Service(){//匿名內部類 //實現介面中的抽象方法 public void show(){ System.out.println("實現Service介面的匿名內部類"); } }; s.show(); Animal pig=new Animal() { @Override public void play() { System.out.println("小豬快跑。。。。"); } @Override public void show() { System.out.println("小豬快吃。。。。。"); } }; pig.show(); pig.play(); Student stu=new Student(){ public void show(){ System.out.println("俺是小學生,嘻嘻嘻嘻"); } }; stu.show(); }}/* * 定義介面 */interface Service{ //抽象方法 void show();}/*抽象類別*/abstract class Animal{ String name; public void show(){ System.out.println("動物在吃。。。。"); } public abstract void play();}class Student{ public void show(){ System.out.println("嘿嘿嘿嘿嘿嘿"); }}
JAVA學習筆記(四十六)- 內部類詳解