內部類(nested classes),面向對象程式設計中,可以在一個類的內部定義另一個類。嵌套類分為兩種,即靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為內部類(inner)。內部類是JAVA語言的主要附加部分。內部類幾乎可以處於一個類內部任何位置,可以與實例變數處於同一級,或處於方法之內,甚至是一個表達式的一部分。
定義
表現形式
優點
public class InnerTest { private String tan = "實例變數"; private static String weizheng = "靜態變數"; private static String niubi = "外部類的類變數"; public void test() { /**非靜態方法裡的內部類 */ class MethodInnerClass { @Override public String toString() { // 非靜態方法裡無法訪問實例的外部變數 System.out.println("非靜態方法的內部類可以訪問外部類的實例變數:" + instAtt); System.out.println("非靜態方法的內部類可以訪問外部類的靜態變數:" + staticAtt); // 非靜態方法裡無法訪問方法的非final的變數// System.out.println(methodAtt); System.out.println("非靜態方法的內部類可以訪問方法的final變數:" + methodFinalAtt); return "my nick name is white"; } } new MethodInnerClass().toString(); System.out.println("-------------我是007的分隔設定-------------"); /**非靜態方法的匿名內部類*/ new Object() { @Override public String toString() { System.out.println("非靜態方法的匿名內部類可以訪問外部類的實例變數:" + instAtt); System.out.println("非靜態方法的匿名內部類可以訪問外部類的靜態變數:" + staticAtt); // 非靜態方法裡匿名內部類無法訪問方法的非final的變數 // System.out.println(methodAtt); System.out.println("非靜態方法的匿名內部類可以訪問方法的final變數:" + methodFinalAtt); return "我是匿名內部類"; } }.toString(); } public static void main(String[] args) { int methodAtt = 1; final int methodFinalAtt = 2; /**靜態方法裡的內部類*/ class MethodInnerClass { @Override public String toString() { // 靜態方法裡無法訪問實例的外部變數 // System.out.println(instAtt); System.out.println("靜態方法的內部類可以訪問外部類的靜態變數:" + staticAtt); // 靜態方法裡無法訪問方法的非final的變數 // System.out.println(methodAtt); System.out.println("靜態方法的內部類可以訪問方法的final變數:" + methodFinalAtt); return "my nick name is white"; } } new MethodInnerClass().toString(); /**靜態方法的匿名內部類*/ new Object() { @Override public String toString() { // 靜態方法的匿名內部類不能訪問外部類的非靜態變數 // System.out.println("非靜態方法的匿名內部類可以訪問外部類的非靜態變數:"+instAtt); System.out.println("非靜態方法的匿名內部類可以訪問外部類的靜態變數:" + staticAtt); // 靜態方法裡匿名內部類無法訪問方法的非final的變數 // System.out.println(methodAtt); System.out.println("非靜態方法的匿名內部類可以訪問方法的final變數:" + methodFinalAtt); return "我是匿名內部類"; } }.toString(); new InnerTest().test(); // 建立靜態內部類(staticInnerClass)的對象 ImOutClass.StaticInnerClass staticIC = new ImOutClass.StaticInnerClass(); staticIC.access(); /** * 建立非靜態內部類(non-staticInnerClass)的對象. * 注意這種建立對象的格式首先創建外部類的對象然後使用對象.new來創建。 */ ImOutClass outC = new ImOutClass(); ImOutClass.InstInnerClass inC = outC.new InstInnerClass(); inC.access(); }}class ImOutClass { private static String staticAtt = "外部類的類變數"; private String instAtt = "外部類的實例變數"; private static String xx = "外部靜態變數"; // privateStringxx="外部類的實例變數"; // 外部類的非靜態方法 public void instanMethod() { System.out.println("和外部類實例方法"); } // 外部類的靜態方法 public static void staticMethod() { System.out.println("和外部類靜態方法"); } /** 靜態內部類(staticInnerClass)*/ public static class StaticInnerClass { public static void InnerClass() { System.out.println("我是靜態內部類"); } public void access() { System.out.println("我可以訪問" + staticAtt); staticMethod(); System.out.println("我可以訪問外部的靜態變數" + xx); // 非靜態的方法instanMethod()無法從靜態的地方使用 // instanMethod(); } } /** 非靜態內部類(non-staticInnerClass)*/ public class InstInnerClass { public InstInnerClass() { System.out.println("我是成員級內部類,非靜態內部類"); } public void access() { System.out.println("我可以訪問" + instAtt); instanMethod(); staticMethod(); System.out.println("我可以訪問外部的靜態變數" + xx); } }}