静态内部类和非静态内部类的区别:它们和外部类的关系,数据的权限,如何调用
最好以例子说明!

解决方案 »

  1.   

    和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套类很相像了,Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上,当然从设计的角度以及以它一些细节来讲还有区别。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。
      

  2.   

    如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着: 
    1. 要创建嵌套类的对象,并不需要其外围类的对象。 
    2. 不能从嵌套类的对象中访问非静态的外围类对象。 publicclass Outer { 
    privatestaticinti = 1; 
    privateintj = 10; 
    publicstaticvoidouter_f1() { 
    } publicvoidouter_f2() { 
    } // 静态内部类可以用public,protected,private修饰 
    // 静态内部类中可以定义静态或者非静态的成员 
    staticclass Inner { 
    staticintinner_i = 100; 
    intinner_j = 200; 
    staticvoidinner_f1() { 
    //静态内部类只能访问外部类的静态成员(包括静态变量和静态方法) 
    System.out.println("Outer.i" i); 
    outer_f1(); 
    } voidinner_f2() { 
    // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法) 
    // System.out.println("Outer.i" j); 
    // outer_f2(); 

    } publicvoidouter_f3() { 
    // 外部类访问内部类的静态成员:内部类.静态成员 
    System.out.println(Inner.inner_i); 
    Inner.inner_f1(); 
    // 外部类访问内部类的非静态成员:实例化内部类即可 
    Inner inner = new Inner(); 
    inner.inner_f2(); 
    } publicstaticvoid main(String[] args) { 
    newOuter().outer_f3(); 

    } 生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类(正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则)
      

  3.   

    一个很老的问题了,和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套类很相像了,Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上,当然从设计的角度以及以它一些细节来讲还有区别。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。