静态方法中不能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 }

 

posted on 2016-01-17 02:09  沈小洋  阅读(2788)  评论(0编辑  收藏  举报

导航