Java编程思想笔记第十章(内部类)

来源:互联网 发布:搜狗排名优化软件 编辑:程序博客网 时间:2024/05/21 00:51

可以将一个类的定义放在另一个类的定义内部,这就是内部类。

如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须指明这个对象的类型:OuterClassName.InnerClassName。

内部类自动拥有对其外围类所有成员的访问权,可以访问其外围类的方法和字段。

如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。

在拥有外部类对象之前是不可能创建内部类对象的。这是因为内部类对象会暗暗地连接到创建它的外部类对象上。但是,如果创建的是嵌套类(静态内部类),就不需要对外部类对象的引用。

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static。这通常称为嵌套类。普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static时,就不是这样了。嵌套类意味着:

(1)要创建嵌套类的对象,并不需要其外围类的对象。

(2)不能从嵌套类的对象中方位非静态的外围类对象。

嵌套类与普通的内部类还有一个区别。普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。

嵌套类可以作为借口的一部分。放到借口中的任何类都自动地是public和static的。

一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。

使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,内部类允许继承多个非接口类型(类或抽象类)。

闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。内部类是面向对象的闭包。

回调的价值在于它的灵活性-可以在运行时动态的决定需要调用什么方法。

当继承了某个外围类的时候,内部类并没有发生什么特别的变化。这两个内部类是完全独立的两个实体,各自在各自的命名空间内。

局部内部类不能有访问说明符,因为它不是外围类的一部分;但是它可以访问当前代码块内的常量,以及此外围类的所有成员。

内部类也必须生成一个.class文件以包含它们的Class对象信息。这些类文件的命名有严格的规则:外围类的名字,加上“$”,再加上内部类的名字。如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符。如果内部类是嵌套在别的内部类之中,只需直接将它们的名字加在其外围类标识符与“$”的后面。

0 0
原创粉丝点击