问答详情
源自:7-5 什么是 Java 中的内部类

为什么执行之后会有错误

package com.sean;


public class HelloWorld {
 
    // 内部类Inner,类Inner在类HelloWorld的内部
    public class Inner {
     public int a=1;
  // 内部类的方法
     
  public void show() {
   System.out.println("welcome to imooc!"+a);
  }
 }
    {   HelloWorld p =new HelloWorld();
        Inner c=p.new Inner();
  System.out.println(c.a);
 }
 public static void main(String[] args) {
       
        // 创建外部类对象
  HelloWorld hello = new HelloWorld();
        // 创建内部类对象
  Inner i = hello.new Inner();
        // 调用内部类对象的方法
  i.show();
 }
}

提问者:SeanTan 2015-08-09 19:54

个回答

  • _神人A
    2015-09-20 18:44:32

    {   HelloWorld =new HelloWorld ();
            Inner c=p.new Inner();
            System.out.println(c.a);
    }

    这段代码错误,因为这是一个初始化代码块,当你new一个HelloWorld的时候,它会执行这段代码,但这段代码里面由于有new HelloWorld(), 它就会继续执行初始化代码块,然后进入了死循环,从而造成内存溢出。楼上说的加个static是可取的,因为static只会执行一次,所以不会造成死循环。

    解决办法是:加一个static,或者把这段去掉。

  • 管理員
    2015-08-10 08:42:28

    {
    	HelloWorld p = new HelloWorld();//有问题
    	Inner c = p.new Inner();
    	System.out.println(c.a);
    }

    这一段会内存溢出

    每创建一个HelloWorld对象a,a也会创建一个HelloWorld对象b,b.....

    你可以把上面这一段去掉或者加上static

    static {
    	HelloWorld p = new HelloWorld();
    	Inner c = p.new Inner();
    	System.out.println(c.a);
    }

    static内部代码所有对象共有。具体很难解释明白。