为什么可以通过外部类的非静态方法实例化内部类?
为什么在静态内部类中可以不用Out.this去访问外部类成员,而可以直接用Out.去访问?
为什么在非静态内部类中不能有静态变量,而可以有静态的常量?

解决方案 »

  1.   

    1.为什么可以通过外部类的非静态方法实例化内部类?
    为什么不可以? 不管是静态还是非静态内部类,都可以在非静态方法中实例化,实例方法也是在对象生成后被调用再执行方法内容即对象创建2.为什么在静态内部类中可以不用Out.this去访问外部类成员,而可以直接用Out.去访问?
    不能用Out.this是因为静态内部类的实例化是不需要外部类的实例为前提的
    用Out.访问的事静态变量,在实例方法中访问自然是不设限的3.为什么在非静态内部类中不能有静态变量,而可以有静态的常量?
    我想首先肯定是设计问题,至于为什么不能有,我想一是保持非静态内部类的属性纯净(没有静态)
    二是考虑到如何访问这个内部类静态变量,系统会变得复杂,内部类对外部类以外不直接可见,外部要访问这个内部类静态变量是不是还需要通过外部类实例,如果是这样,系统对待这个问题就显得不一致
    还有什么是静态常量?
      

  2.   


    谢谢你的回答
    我补充下第一个问题:public class Out2_2 {

    //通过外部类的非静态方法实例化内部类
    public void instantiated()
    {
    in2_2 in = new in2_2();                                                 //为什么可以这样实例化?
    }
    class in2_2{

    public void A()
    {

    }
    }
    }
      

  3.   

    你的意思是应该再main 方法中实例化吗? 内部类可以在外类的任何地方 new,
    但是在main中必须先有外类,再有内部类~
      

  4.   

    楼主的第一个问题,其实非静态的内部类又称成员内部类,顾名思义,就是跟一个类里面的成员属性,方法一样,但它毕竟也是个类啊,所以就直接  in2_2 in = new in2_2();  这样就可以了。
    第二个问题,你可以想象一下,在一个静态的方法能用this关键字么?不能吧!那么在静态内部类也是同样,只需要直接用外部类调用就行。
    第三个问题,JAVA官方的内部类的规范:java language specification:Inner classes may not declare static initializers (§8.7)  or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).不能声明静态成员,除非是编译期常量字段
      

  5.   

    just  up  it 
      

  6.   


    错,静态内部类就相当于外部类的一个静态属性。静态内部类的static变量只有在静态内部类第一次被实例化的时候才分配内存空间。