標籤:初始化塊 構造 子類 mem bst ++ 調用 public nal
/** * 常規內部類:常規內部類沒有用static修飾且定義在在外部類類體中。 * 1.常規內部類中的方法可以直接使用外部類的執行個體變數和執行個體方法。 * 2.在常規內部類中可以直接用內部類建立對象 */public class MyOuter {private int x = 100;class MyInner{private String y="Hello!";public void innerMethod(){System.out.println("內部類中 String ="+y);System.out.println("外部類中的x ="+x);outerMethod();System.out.println("x is "+MyOuter.this.x);}}public void outerMethod(){x++;}public void makeInner(){//在外部類方法中建立內部類執行個體MyInner in = new MyInner();}public static void main(String[] args){MyOuter mo = new MyOuter();//使用外部類構造方法建立 mo 常規內部類需要通過外部類執行個體來newMyOuter.MyInner inner = mo.new MyInner();inner.innerMethod();}}/** * 靜態內部類:與類的其他成員相似,可以用static修飾內部類, * 這樣的類稱為靜態內部類。靜態內部類與靜態內部方法相似, * 只能訪問外部類的static成員, * 不能直接存取外部類的執行個體變數,與執行個體方法,只有通過對象引用才能訪問。 */public class MyOuter2 {public static int x=100;public static class Myinner{private String y="Hello!";/** * 由於static內部類不具有任何對外部類執行個體的引用, * 因此static內部類中不能使用this關鍵字來訪問外部類中的執行個體成員, * 但是可以訪問外部類中的static成員。這與一般類的static方法相通 */public void innerMethod(){System.out.println("x="+x);System.out.println("y="+y);}}public static void main(String[] args){MyOuter2.Myinner si = new MyOuter2.Myinner();si.innerMethod();}}/** * 局部內部類:在方法體或語句塊(包括方法、構造方法、局部塊或靜態初始化塊)內部定義的類成為局部內部類。 * 局部內部類不能加任何存取修飾詞,因為它只對局部塊有效。 * 1.局部內部類只在方法體中有效,就想定義的局部變數一樣,在定義的方法體外不能建立局部內部類的對象 * 2.在方法內部定義類時,應注意以下問題: * 1.方法定義局部內部類同方法定義局部變數一樣,不能使用private、protected、public等訪問修飾說明符修飾, * 也不能使用static修飾,但可以使用final和 abstract修飾 * 2.方法中的內部類可以訪問外部類成員。對於方法的參數和局部變數,必須有final修飾才可以訪問。 * 3.static方法中定義的內部類可以訪問外部類定義的static成員 * */public class MyOuter3 {private int size=5,y=7;public Object makeInner(int localVar){final int finalLocalVar = localVar;//建立內部類,該類只在makeInner()方法有效,就像局部變數一樣。//在方法體外部不能建立MyInner類的對象class Myinner{int y=4;public String toString(){return "OuterSize:"+size+" localVar:"+finalLocalVar+"\nthis.y="+this.y;}}return new Myinner();}public static void main(String[] args){Object obj = new MyOuter3().makeInner(47);System.out.println(obj.toString());}}/*匿名內部類:定義類的最終目的是建立一個類的執行個體,但是如果某個類的執行個體只是用一次,則可以將類的定義與類的建立,放到與一起完成,或者說在定義類的同時就建立一個類 以這種方法定義的沒有名字的類成為匿名內部類。 聲明和構造匿名內部類的一般格式如下: new ClassOrInterfaceName(){ 類體 } 1.匿名內部類可以繼承一個類或實現一個介面,這裡的ClassOrInterfaceName是匿名內部類所繼承的類名或實現的介面名。但匿名內部類不能同時實現一個介面和繼承一個類,
也不能實現多個介面。如果實現了一個介面,該類是Object類的直接子類,匿名類繼承一個類或實現一個介面,不需要extends和implements關鍵字。 2.由於匿名內部類沒有名稱,所以類體中不能定義構造方法,由於不知道類名也不能使用關鍵字來建立該類的執行個體。實際上匿名內部類的定義、構造、和第一次使用都發生在同樣一個地方。
此外,上式是一個運算式,返回的是一個對象的引用,所以可以直接使用或將其複製給一個物件變數。例: TypeName obj=new Name(){ 此處為類體 } 同樣,也可以將構造的對象作為調用的參數。例: someMethod(new Name(){ 此處為類體 });*/public class MyOuter4 {private int size=5;public Object makeInner(int localvar){final int finallocalvar = localvar;return new Object(){public String toString(){return "OuterSize="+size+"\nfinalLocalvar="+finallocalvar;}};}public static void main(String args[]){Object obj=new MyOuter4().makeInner(67);System.out.println(obj.toString());}}
java 四種內部類