原因如下:
1.內部類可以訪問外部類的成員變量
2.對象創建完成后對象的成員變量才會被分配空間
3.main的靜態方法執行時可以不存在外部類,不創建實體對象
4.內部類能訪問成員變量意味着一定存在外部類實體對象
因為3和4矛盾,所以在靜態方法中不能new內部類的實體對象
解決辦法1:新建一個非靜態方法init(),在init()方法中new內部類的實體對象.然后在靜態方法main中新建一個外部類的實體對象去調用init()方法
示例代碼:
1 /* 2 * Test類本身就是外部類 3 */ 4 public class Test { 5 public static void main(String[] args) { 6 new Test().init();//此處為新建的外部類的實體對象 7 } 8 //新建一個非靜態方法,在這個方法的內部new內部類的實體對象 9 private void init(){ 10 Outputer outputer = new Outputer(); 11 new Thread(new Runnable(){ 12 public void run() { 13 while(true){ 14 try { 15 Thread.sleep(10); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 outputer.output("shen_smile"); 20 } 21 } 22 }).start(); 23 } 24 //內部類 25 class Outputer{ 26 public void output(String name){ 27 int len = name.length(); 28 for(int i=0;i<len;i++){ 29 System.out.print(name.charAt(i)); 30 } 31 System.out.println(); 32 } 33 } 34 }
解決辦法2:如果想直接在靜態方法中new內部類的實體對象,不想使用方法1,可以將內部類加static修飾,然后在new內部類時加final關鍵字修飾
示例代碼:
1 /* 2 * Test類本身就是外部類 3 */ 4 public class Test { 5 public static void main(String[] args) { 6 final Outputer outputer = new Outputer(); 7 new Thread(new Runnable(){ 8 public void run() { 9 while(true){ 10 try { 11 Thread.sleep(10); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 outputer.output("shen_smile"); 16 } 17 } 18 }).start(); 19 } 20 //內部類 21 static class Outputer{ 22 public static void output(String name){ 23 int len = name.length(); 24 for(int i=0;i<len;i++){ 25 System.out.print(name.charAt(i)); 26 } 27 System.out.println(); 28 } 29 } 30 }