黑马程序员技术交流社区

标题: 深入探讨Java内部类[转] [打印本页]

作者: 张远游    时间: 2012-11-28 23:36
标题: 深入探讨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()方法,来测试这个类。
7、  在多层嵌套类中,最深层的嵌套类可以透明底访问它所嵌入的外围类的所有成员
六、为什么需要内部类?
每个内部类都能独立地继承自一个(接口)的实现,所以无论外围类是否已经继承了某个(接口的)的实现,对于内部类都没有影响。
普通的类无法实现对抽象类和普通类的多重继承,而采用内部类可以实现,这在有时候是很有用的。内部类使得多重继承的解决方案变得更加完整。接口的实现解决了部分问题,而内部类有效地实现了“多重继承”,即:内部类可以继承非接口类型。
用内部类实现多个接口的意义:
1、  内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立;
2、  在当个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类;
3、  创建内部类对象的时刻并不依赖于外围类对象的创建;
4、  内部类并没有令人迷惑的“is-a”关系,它就是一个独立的类。

本文出自 “南望居士-Java爱好者” 博客,请务必保留此出处http://shizhong.blog.51cto.com/721306/202856







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2