內部類
- 靜態內部類
- 成員內部類
- 局部內部類
- 匿名內部類(屬於局部內部類的一種)
1. 靜態內部類
-
靜態內部類可以等同看作靜態變量
-
內部類的重要作用:
- 可以訪問外部類中的私有數據
-
靜態內部類可以直接訪問外部類的靜態數據(靜態變量,靜態方法),無法直接訪問成員(實例變量,實例方法)
class OuterClass { // 靜態變量 private static String s1="A"; //實例變量 private String s2 = "B"; //靜態方法 private static void m1() { System.out.println("static's m1() method executed"); } //實例方法 private void m2() { System.out.println("m2() method executed"); } // 定義靜態內部類,可以使用 public, private, protected, default修飾 static class InnerClass{ // 靜態方法 public static void m3() { System.out.println("static's m3() method executed"); System.out.println(s1); m1(); // System.out.println(s2); // m2(); } // 成員方法 public void m4() { System.out.println("m4() method executed"); System.out.println(s1); m1(); // System.out.println(s2); // m2(); } } public static void main(String[] args) { //執行m3 OuterClass.InnerClass.m3(); // 執行m4 OuterClass.InnerClass inner = new OuterClass.InnerClass(); inner.m4(); } }
2. 成員內部類
-
成員內部類可以等同看作成員方法
-
成員內部類中不能有靜態聲明
- 包括靜態變量和靜態方法
-
成員內部類可以訪問外部類的所有數據
public class MemberInnerClass { // 靜態變量 private static String s1="A"; //實例變量 private String s2 = "B"; //靜態方法 private static void m1() { System.out.println("static's m1() method executed"); } //實例方法 private void m2() { System.out.println("m2() method executed"); } // 定義靜態內部類,可以使用 public, private, protected, default修飾 class InnerClass{ // 靜態方法// 成員內部類中不能有靜態方法 // public static void m3() { // // System.out.println("static's m3() method executed"); // System.out.println(s1); // m1(); //// System.out.println(s2); //// m2(); // } // 成員方法// 成員內部類可以訪問外部類的所有數據 public void m4() { System.out.println("m4() method executed"); System.out.println(s1); m1(); System.out.println(s2); m2(); } } public static void main(String[] args) { // 創建外部對象 MemberInnerClass mic = new MemberInnerClass(); InnerClass inner = mic.new InnerClass(); inner.m4(); } }
3. 局部內部類
-
局部內部類等同於局部變量
-
局部內部類不能用訪問權限控制修飾符修飾
- 局部變量也沒有見過用public等修飾符修飾的(=_=)
-
局部內部類中不能有靜態聲明(包括靜態變量和靜態方法)
-
局部內部類中訪問內部類外的局部變量必須是
final
的-也可以不是
final
的,只要後續不在局部內部類外改變這個變量的值就可以啦 -
局部內部類相當於局部變量,出了大括號
{}
之後就沒人認識了- 要使用局部內部類中的方法,必須在局部內部類外,創建局部對象
public class TempInnerClass { public void m1() { final int i = 10; // 聲明局部內部類時候,class前面不能加訪問控制修飾符 class InnerClass{ // public static void m1() {// 局部內部類中不能有靜態聲明 // }; public void m1() { //Local variable i defined in an enclosing scope must be final or effectively final System.out.println(i);// 局部內部類調用內部類外的變量時候,變量必須是final的或者是有效的final的 } } // i = 100; // 調用局部內部類中的方法 InnerClass inner = new InnerClass(); inner.m1(); } public static void main(String[] args) { new TempInnerClass().m1(); } }
4. 匿名內部類
指的是:類沒有名字
一般用於接口的實現
-
優點:少定義一個類
-
缺點:無法重複使用
public class NamelessInnerClass { public static void t(CustomeService cs) { cs.logout(); } public static void main(String[] args) { //如何調用t方法?? // 1. 新建一個類,實現CustomeService接口 t(new CustomeServiceImp()); // 2. 使用匿名內部類 // new CustomeService() {} 這些全都屬於匿名內部類 t(new CustomeService() { @Override public void logout() { System.out.println("匿名內部類:成功退出程序"); } }); } } interface CustomeService{ void logout(); } class CustomeServiceImp implements CustomeService{ @Override public void logout() { System.out.println("成功退出程序"); } }