和子类有什么不同?谢谢~~

解决方案 »

  1.   

    这是我当初看Thinking in java时候摘录和总结的部分,希望对你有用。内部类
    一、 内部类自动拥有对其外围类的所有成员的访问权。
    当某个外围类对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。但是如果内部类是非static的,内部类的对象只能在与其外围类的对象相关联的情况下才会被创建。继承内部类的时候也需要其外围类的对象引用,否则继承无效。
    二、 .this和.new关键字
    .this:在内部类中生成对其外围类的引用。一般可以使用外围类的名字后面紧跟圆点和this。
    如果想告知某些其他对象,去创建某个内部类的对象,必须在new表达式中提供对其他外部类对象的引用,这就需要使用.new语法。例如:
    Public class DotNew{}
    Public class Inner{}
    }
    Public static void main(String args[]){
    DotNew dn=new DotNew();
    DotNew.Inner dni=dn.new Inner();
    //dn.new DotNew.Inner(); 这是错误的
    }//在拥有外部了对象之前是不可能创建内部类对象的(非Static内部类)三、 内部类可以向上转型(Upcasting)为其基类,或者接口。这时,内部类得到了对接口的引用,能够方便地隐藏实现细节。
    四、 内部类可以定义在方法和作用域中(需要慢慢地理解)
    a) 可以定义在一个方法中
    b) 可以定义在作用域中
    c) 匿名内部类可以实现一个接口
    d) 匿名类可以扩展有非默认构造器的类
    e) 匿名类可以执行字段初始化
    f) 匿名类可以通过实例初始化实现构造(匿名类不可能有构造器)
    五、  嵌套类
    如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static普通的内部类自动获取对外围类的引用,而嵌套类具有static的特性,不依赖外围类对象的建立,也没有指向外围类的对象。
    1、 要创建嵌套类的对象,不需要外围类的对象;嵌套类中不可以使用this引用;
    2、 不能从嵌套类的对象中访问非static的外围类对象;
    3、 嵌套类有许多类似static的属性,因为嵌套类本身就是static的,嵌套类可以有static的数据和static字段,还可以包含static的嵌套类,而普通内部类是不可以的。
    4、 嵌套类可以作为接口的一部分,而一般情况下,接口内是不允许有任何具体的代码的;
    5、 嵌套类可以作为一些公共代码,使得他们可以被某个接口的所有不同实现所共用;
    6、 可以使用嵌套类在每个类中都写一个Main()方法,来测试这个类:例如:
    Public class TestBed{
    Public void f(){
    System.out.println(“f()”);
    }
    Public static void main(String args[]){
    TestBed t=new TestBed();
    t.f();
    }
    }
    7、 在多层嵌套类中,最深层的嵌套类可以透明地问它所嵌入的外围类的所有成员
    六、 为什么需要内部类?
    每个内部类都能独立地继承自一个(接口)的实现,所以无论外围类是否已经继承了某个(接口的)的实现,对于内部类都没有影响。
    普通的类无法实现对抽象类和普通类的多重继承,而采用内部类可以实现,这在有时候是很有用的。内部类使得多重继承的解决方案变得更加完整。接口的实现解决了部分问题,而内部类有效地实现了“多重继承”,即:内部类可以继承非接口类型。
    用内部类实现多个接口的意义:
    1、 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立;
    2、 在当个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类;
    3、 创建内部类对象的时刻并不依赖于外围类对象的创建;
    4、 内部类并没有令人迷惑的“is-a”关系,它就是一个独立的类。