成員
成員內部類
靜態內部類
局部
方法內部類
匿名內部類
依賴外部類對象的:成員內部類,方法內部類,匿名內部類
靜態內部類不依賴外部類的對象,所以,我們在項目中優先考慮選擇靜態內部類
package QianFeng02; //內部類 public class InnerTest { public static void main(String[] args){ //在外部創建成員內部類實例, Outer outer=new Outer(); // 因為成員內部類需要依賴外部類的對象,不建議這樣創建 // Outer.Inner2 inner2=outer.new Inner2(); // inner2.print(); outer.innerPrint();//通過innerPrint訪問內部類 outer.show();//方法內部類 Outer.Inner3 inner3=new Outer.Inner3(); //靜態類直接:類名.內部靜態類名 inner3.print(); outer.print11();//(1.繼承式) outer.print2();//(2.匿名類的 接口式) outer.print3(new Eat(){//(匿名內部類 3.參數式) public void eat() { System.out.println("匿名內部類 3.參數式"); } });//(3.參數式匿名類) } } class Outer{ private String name="除了靜態內部類,內部類成可以很方便使用成員變量"; //----------------1.成員內部類---------------- public void innerPrint(){//建議在外部類中定義一個方法,對外提供訪問內部類接口 Inner2 inner2=new Inner2(); inner2.print(); } //內部類(封裝性) class Inner2{//1.成員內部類 private void print(){ System.out.println("{成員內部類}"+name); } } // ----------------2.方法內部類---- ---------- public void show(){ final int x=10; //方法內部類的引用的變量 必須是常量(final),不寫聲明默認final class Inner2{ public void print(){ System.out.println("{方法內部類}"+x+name);//為什么用final呢? } } Inner2 inner2=new Inner2();//調用方法內部類(在方法里面調用實例化)不能在方法外實例化 inner2.print(); } //----------------3.靜態內部類---------------- /* 在一個類內部定義一個靜態內部類: 靜態的含義是該內部類可以像其它靜態成員一樣,沒有外部類對象時,可以直接訪問 靜態嵌套僅能訪問外部類的靜態成員和方法 */ static class Inner3{ public void print(){ System.out.println("靜態內部類"); } } //----------------4.匿名內部類---------------- /*1.不能有構造方法 2.不能定義任何靜態成員,方法 3.不能是public.protected,private,static 4.一定是在new的后面,用其隱含一個接口或者實現一個類 5.匿名內部類為局部的,所以局部內部類的所有限制都對其生效 * */ //(1.繼承式) public void print11(){ CatGame cat=new CatGame(){ public void game(){ System.out.println("貓玩"); } }; cat.game(); } //*(2.接口式) public void print2(){ Eat e=new Eat(){ @Override public void eat() { System.out.println("匿名類的 接口式"); } }; e.eat(); } //(3.參數式) public void print3(Eat eat){//傳入接口 eat.eat(); } } interface Eat{ public void eat(); } abstract class CatGame{ public abstract void game(); } /* 方法內部類的引用的變量 必須是常量(final) 為什么用final呢? final 修飾變量是 常量,會把變量進入到常量池,延長生命周期,以免被銷毀 jdk1.8 可以不寫final ,系統會默認 final. */