《JAVA编程思想》5分钟速成:第10章(内部类)

第10章 内部类

前言:
1、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

2、静态变量和实例变量的区别?

3、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

4、Java 中的final关键字有哪些用法?

5、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

6、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?


10.1 链接到外部类

Java非static的普通内部类自动拥有对其外围类所有成员的访问权。

a. Java&C++的区别:

Java普通内部类能访问其外围对象(enclosing object)的所有成员,而不需要任何特殊条件 。C++嵌套类的设计只是单纯的名字隐藏机制,与外围对象没有联系,也没有隐含的访问权。

b. Java实现原理:

在Java中,当某个类创建一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类的对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。这些细节是由编译器处理的。Java的迭代器复用了这个特性。


10.2 .this 与 .new

Java非static的普通内部类可应用.this返回其外围对象的引用。

外围对象可应用.new来生成一个内部类对象。

<code>public class DotThis{    public class Inner{        public DotThis outer(){            return DotThis.this; // a plain "this" would be Inner's "this"        }    }    public Inner inner(){ return new Inner(); }    public static void main(String[] args){        DotThis dt = new DotThis();        DotThis.Inner dti = dt.inner();        dti.outer().f();    }}/<code>


10.3 匿名内部类

Anonymous Inner Class.:没有定义class name的内部类。


10.4 Java嵌套类

嵌套类:内部类声明为static时,不再包含外围对象的引用.this,称为嵌套类(与C++嵌套类大致相似,只不过在C++中那些类不能访问私有成员,而在Java中可以访问)。

- 创建嵌套类,不需要外围对象。

- 不能从嵌套类的对象中访问非静态的外围对象。

10.4.1 接口内部的类

嵌套类可以作为接口的一部分(正常情况下,接口内部不能放置任何代码)。放到接口中的任何类都自动是public和static的。因为类是static的,只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。

10.4.2 从多层嵌套类中访问外部类的成员

一个内部类被嵌套多少层并不重要——它能透明地访问它所嵌入的外围类的所有成员。


10.5 为什么需要内部类

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

内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:后者不是总能享用到接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:

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

内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,内部类使得Java实现继承多个非接口类型(类或抽象类)。


10.6 闭包与回调

闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用(.this),在此作用域内,内部类有权操作所有的成员,包括private成员。

回调(callback),通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。Java中没有指针,通过内部类提供的闭包功能可以实现回调。


10.7 局部内部类

在代码块|方法中定义的类。

应用场景:class定义&和new Object() 均位于方法内部。


10.8 Java接口和内部类总结

Java的接口和内部类比其他面向对象的概念更深奥复杂,C++没有这些,将两者结合起来,同样能够解决C++中的用多重继承所能解决的问题。


《JAVA编程思想》5分钟速成:第10章(内部类)


分享到:


相關文章: