内部类的一些笔记:
- 外部类(Outer Class) 可以访问内部类 (Inner Class) 的非 private 成员
- 内部类 (Inner Class) 可以访问外部类(Outer Class) 的所以成员,包括 private 成员
- 内部类 (Inner Class) 会自动持有外部类(Outer Class) 的引用
Nested Class (静态内部类):
当把内部类声明为 static 时,这个内部类也称为 Nested Class. 由于被声明为 static, 他和外部类的通信将受一定程度的影响. 一般的内部类不可以有静态块,静态域或者其他静态内部类; 而Nested Class 无此限制.
- 创建 Nested Class 的实例时候不需要外部类的实例
- Nested Class 不可以访问外部类的非 static 成员
Why Inner Class?
内部类还具有以下特征:
- 内部类可以有多个实例,每一个实例,对于外部类来说都有独立的信息
- 一个外部类可以有多个内部类,每个内部类可以针对同一抽象有不同的实现
从以上两点可以看出,内部类可以解决多继承的问题.
3. 内部类的实例创建并不与外部类的实例的创建紧联在一起
因此,内部类什么时候实例化,与外部类的实例化没多大关系,甚至可以单独实例化内部类.
Closure & Call back:
Closure is an object that contains infomation from the scope in which it was created.
------<<Think in Java>>
某种意义上,内部类就是 Closure.
Call Back 回调:
回调的概念来自C语言的函数指针。一般的函数调用是通过给定方法名和参数,程序在编译期就知道了应该调用调用栈中的哪个方法。这是静态调用。有时候程序需要在运行时动态的调用某些方法,这种调用不能是显式的,而是通过函数指针隐式的动态调用。函数指针可以理解为指向函数地址的变量,它在C/C++语言中有自己的声明方式。例如,
void function(); // 函数定义
ptr = function; // p为函数指针,指向函数 function 的地址
在其他方法中调用 call(ptr) ,那么call()方法将调用ptr指向的函数。
Java语言中没有函数指针的概念,那么java是怎么实现回调的呢?