static修飾內部類的含義:java
一、普通內部類通常有一個指向外部類的隱式引用,若內部類用static修飾,此關係將消失,嵌套類也將不須要經過外部引用實例進行建立;測試
二、不能從嵌套類中訪問非靜態的外圍類成員;this
三、普通內部類的字段和方法只能放到類的外層層次上,即普通內部類不能含有靜態數據(字段、方法和嵌套類);而嵌套類是能夠包含靜態數據的。spa
package com.lh.innerclass.class4; public interface Contents { int value(); }
package com.lh.innerclass.class4; public interface Destination { String readLabel(); }
package com.lh.innerclass.class4; public class Parcel { private static class ParcelContents implements Contents{ private int i=11; public int value(){ return this.i; } } //普通內部類中不能有靜態成員!!! protected static class ParcelDestination implements Destination{ private String label; //內部類的構造器通常設置爲私有 private ParcelDestination(String whereTo){ this.label = whereTo; } private static int x = 10; public String readLabel(){ return this.label; } static void f(){ System.out.println("ParcelDestination.f()"); } //嵌套類中能夠有嵌套類 static class AnotherLevel{ private static int x = 10; static void f(){ System.out.println("ParcelDestination.AnotherLevel.f()"); } } //嵌套類中也能夠有普通內部類 private class InnerClass{ private int x = 10; //普通內部類中不能定義靜態字段 // private static String aa = "a"; private String a; void f(){ System.out.println("ParcelDestination.InnerClass.f()"); } //普通內部類中不能定義靜態方法 // static void ff(){ // System.out.println("ParcelDestination.InnerClass.f()"); // } } } static Contents contents(){ return new ParcelContents(); } static Destination destination(String s){ return new ParcelDestination(s); } public static void main(String[] args) { Parcel.contents(); Parcel.destination("Tasmania"); } }
package com.lh.innerclass.class4; /**** * * 接口內部的類:默認帶有static關鍵字的嵌套類! * * @author Liu * */ public interface ClassInInterface { void howdy(); //默認帶有static關鍵字的嵌套類! class Test implements ClassInInterface{ public void howdy() { System.out.println("howdy!"); } public static void main(String[] args) { new Test().howdy(); } } }
注:在接口中定義的嵌套類默認是public的且帶關鍵字staticcode
package com.lh.innerclass.class4; /**** * * 從多層嵌套類中訪問外部類的成員 * 此處嵌套類含義:普通內部類 * * @author Liu * */ class MNA{ void f(){ System.out.println("MNA.f()"); } class A{ void g(){ System.out.println("MNA.A.g()"); } class B{ void h(){ System.out.println("MNA.A.B.h()"); A.this.g(); MNA.this.f(); } } } } public class MultiNestingAccess { public static void main(String[] args) { new MNA().new A().new B().h(); } }