问题,见下面的代码注释.
多谢赐教.interface TestInterface
{
  void test();
}class OutterClass
{
  class CommInnerClass implements TestInterface  //普通内部类
  {
    public void test()
    {
      System.out.println("This is Common Inner Class.");
    }
  }
  
  static class StaticInnerClass implements TestInterface //静态内部类
  {
    public void test()
    {
      System.out.println("This is Static Inner Class.");
    }
  }
}
public class TestInnerClass
{
  public static void main(String[] args)
  {
    OutterClass oc = new OutterClass(); //一个外部类对象
    OutterClass.CommInnerClass commInnerClass = oc.new CommInnerClass();
    //创建普通内部类,必须要要有一个外部类的对象,然后用外部类对象.new的形式创建内部类对象
    OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();
    //而创建静态内部类,必须用new OutterClass.StaticInnerClass(); 这种方式
    //staticInnerClass = new oc.StaticInnerClass(); //用这种方式反而不行,为什么不行?
  }
}

解决方案 »

  1.   

    static与类相关
    非static与对象实例相关
      

  2.   

    oc.StaticInnerClass可能是oc包中的一个类,编译器无法区分
      

  3.   

    1)对象可以调用静态方法,是因为静态方法属于整个类,包括对象
    2)对象不能调用内部静态构造方法,是因为内部静态类不属于对象
    ps:newinstance.method() 表明此方法是属于这个对象的,但是如果这个method() 是构造方法,表明构造出来的对象依赖于 newinstance ,显然静态内部类不依赖于具体对象
      

  4.   

    静态表示不依赖于实例就可以直接访问,非静态表示它和实例有关在一般的内部类里,CommInnerClass 可以访问其所在外部类 OutterClass 的实例成员变量,因此 CommInnerClass 必须在外部类实例存在的情况下才可以产生其 OutterClass 的实例。例如,外部类有一个成员变量:public int a; 因为非静态内部类 CommInnerClass 可以访问这个变量 a,而这个变量 a 又必须在外部类 OutterClass 实例存在时才会有,并且如果有N个 OutterClass 实例,就会有N个变量 a,并且每个 CommInnerClass 访问到的变量 a 可能会不一样。所以一般的内部类必须要通过外部类实例来创建对象。静态内部类可以在不创建其外部类的情况下创建其对象,在静态内部类的实例方法里,是不可以访问其外部类的实例成员变量的。因为静态内部类实例存在时,可能其外部类对象还不存在,也可能有很多个对象存在。
      

  5.   

    内部类并没有想象的那么复杂,可以把内部类看作一个特殊的属性
    静态内部类就相当于一个静态的特殊属性,可以不通过实例调用
    非静态内部类就相当于一个非静态的特殊属性,需要通过实例调用
    OutterClass.CommInnerClass commInnerClass = oc.new CommInnerClass(); //所以这里需要实例oc
    OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass(); //这里不需要实例