静态方法中不能new内部类的实体对象
原因如下:
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 }