[toc]
内部类
内部类可以有外围类所有元素的访问权限 比方说迭代器就是通过内部类的方式实现的
内部类得到外部类
public class DotThis {
void f() {
System.out.println("DotThis.f()");
}
public class Inner {
public DotThis outer() {
return DotThis.this;
}
}
}
创建内部类
public class DotNew {
public static void main(String[] args) {
DotNew dn = new DotNew();
DotNew.Inner = Dot.new Inner();
}
}
内部匿名类
public class Parcel7 {
public Contents contents() {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
}
}
}
创建一个继承自Contents的内部匿名类的对象, 使用的构造函数是Content();
如果内部匿名类希望使用一个外部的对象, 那么编译器会要求引用的参数是final的.(在Java 8 的lamdba 中也是这么要求的?)
内部类的使用方式
迭代器
Iterator 就是这么实现的
用内部类实现闭包
闭包是一个可以调用的对象,它记录了一些信息, 这些信息来自于创建它的作用域
interface Incrementable {
void increment();
}
class Callee1 implement Incrementable {
private int i = 0;
public void increment() {
i++;
}
}
class MyIncrement {
public void increment() {
println("Other operatorion");
}
public void f(MyIncrement mi) {
mi.increment();
}
}
class Callee2 extend MyIncrement {
private int i = 0;
public void increment() {
super.increment();
i++;
print(i);
}
private class Closure implements Incrementable {
public void increment() {
Callee2.this.incrment();
}
}
Incrementable getCallbackReference() {
return new Closure();
}
}
public Caller {
private Incrementable callbackReference;
Caller(Incrementable chb) {
this.callbackReference = chb;
}
void go() {
callbackReference.increment();
}
}
内部类和控制框架
比方说在Swing 中
public class Test {
public static void main(String[] args) {
Button button = new Button();
button.setPush(new Action() {
@Override
public void doSomething(Event e) {
do something;
}
});
}
}
内部类的继承
因为内部类的构造器必须连接到指向其外围类的引用. 那个指向外围类对象的“秘密的”引用必须被初始化, 而在导出类中不再存在可以链接的默认对象.所以必须使用特殊的语法来明确说明这这两者之间的关系.
class WithInner {
class Inner {
}
}
class InheritInner extends WithInner.Inner {
// 必须在构造函数中有如下的语法 说明内部类和wai
InHeritInner(WithInner wi) {
wi.super();
}
}
网友评论