java里面static一般用來修飾成員變量或函數。但有一種特殊用法是用static修飾內部類,普通類是不允許聲明為靜態的,只有內部類才可以。
被static修飾的內部類可以直接作為一個普通類來使用,而不需實例一個外部類(見如下代碼):
需要注意的是當一個內部類沒有使用static修飾的時候,是不能直接使用內部類創建對象,須要先使用外部類對象點new內部類對象及(外部類對象.new 內部類())
public class OuterClass { 2 public static class InnerClass{ 3 InnerClass(){ 4 System.out.println("============= 我是一個內部類'InnerClass' ============="); 5 } 6 } 7 } 8 9 10 public class TestStaticClass { 11 public static void main(String[] args) { 12 // 不需要new一個InnerClass 13 new OuterClass.InnerClass(); 14 } 15 }
如果沒有用static修飾InterClass,則只能按如下方式調用:需要先new 一個外部類實例
OuterClass oc = new OuterClass(); 在使用外部類實例點內部類實例
oc.new InnerClass();
package inner_class; 2 3 public class OuterClass { 4 public class InnerClass{ 5 InnerClass(){ 6 System.out.println("============= 我是一個內部類'InnerClass' ============="); 7 } 8 } 9 } 10 11 public class TestStaticClass { 12 public static void main(String[] args) { 13 // OutClass需要先生成一個實例,然后再new一個InnerClass(); 14 OuterClass oc = new OuterClass(); 15 oc.new InnerClass(); 16 } 17 }
注意:如果內部類沒事有使用static 修飾,是不能創建實例的回報錯 入下圖代碼所示
public class SyncDubbo2 { static class Main { public int i = 10; public synchronized void operationSup(){ try { i--; System.out.println("Main print i = " + i); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } class Sub extends Main { //沒有使用static修飾的內部類不能直接創建對象 public synchronized void operationSub(){ try { while(i > 0) { i--; System.out.println("Sub print i = " + i); Thread.sleep(100); this.operationSup(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { Sub sub = new Sub(); //此處內部類沒用static修飾會報錯誤The value of the local variable sub is not used
//沒有使用static修飾的內部類不能直接創建對象
} }); t1.start(); } }