前言

忙碌的国庆终于结束了。。。回老家参加了好兄弟的婚礼,真是整整忙了一整个假期,不过也贼替他们开心!

假期回来了要好好开始复习了,之前TIJ的笔记好久没写了,这次把第10,11两章的内容写好!

第十章 内部类

就是把一个类的定义放到另一个类的内部。

10.1 创建

普通内部类在外部类的非静态方法中调用与普通类没区别;

普通内部类在外部类的非静态方法之外的任何位置创建某个内部类的对象,必须用【外部类.内部类】这种形式。

10.2 链接到外部类

书中给了一个用内部类实现迭代器模式的例子,关于迭代器模式可以看下:

迭代器模式1

迭代器模式2

其实迭代器模式挺好理解的,就是给集合实现遍历,删除和查询的部分功能,大致的思想就是有一个功能接口和一个集合接口,在功能接口的实现类内部关联上集合接口,然后实现遍历的相关功能。

在内部类是 非静态类时,内部类对象会捕获一个指向外部类的引用。——>非静态内部类内部不能有静态变量,静态代码块和静态方法。原因其实很简单,因为类的静态变量等会在类加载之后才会有,而静态内部类实际上是外部类的普通成员变量,如果第一次调用非静态内部类的静态变量等时外部类还没有实例化,此时内部类根本就没有加载,救出错了。

10.3 .this&.new

非静态内部类实例化:A.B b = a.new B(); (A,B分别为外部类,内部类,a为外部类实例变量)。

静态内部类实例化:A.B b = new A.B();

在内部类中引用外部类:A.this

10.4 内部类与向上转型

通过在内部实现多个内部类继承不同的接口,可以很好的实现封装,并且逻辑也更清晰。这样也可以使接口的实现更加隐蔽和灵活。

同时,通过与访问权限的控制配合,可以完全组织任何依赖于类型的编码,并完全隐藏了实现的细节。

这里可以参考书194-195。这里说的感觉很有作用,在zookeeper的源码中也看到了这样的使用。

10.5 局部内部类

局部内部类在编译期就已经编译了,只是它们的作用域被限制了。

局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

10.6 匿名内部类

匿名内部类可以有参数,也可以无参数。

匿名内部类可以在一个完整的类基础上新建一个匿名内部类,完全复用类名和函数等,也可以不复用,这时更像是原类的导出类。

如果匿名内部类函数带参数,且参数是对象,则必须为final类型。

匿名内部类无法实现构造函数,因为没有名字,可以间接用实例构造函数的方式去实现,其实就是在一个普通函数内部去实现那个构造函数的功能,然后调用一遍。

10.7 嵌套类(静态内部类)

创建嵌套类的对象,并不需要外部类的对象;

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

10.7.1接口中的类

接口中任何类都是static public的。

接口中的类甚至可以实现其外围接口。

10.8 内部类必要性

每个内部类都可以独立的继承自一个接口的实现,所以无论外围类是否已经继承了某个实现,对内部类都没有影响。这样,内部类就提供了一个外部类可以继承过个具体的或抽象的类的能力,使多重继承的解决方案变得更加完整。接口从辐射的角度解决了部分问题,而内部类感觉是从更直接的角度去实现了多重继承;

内部类可以有多个实例,用来保存不同的信息,并与外部类独立;

在单个外围类中,可以让多个内部类以不同方式实现同一个接口或继承同一个类,这样一个类可以表现出不同的功能;