Member class - 成员类
一个静态成员类,若去掉“static”关键字,就成为成员类
类似于外部类的实例函数,成员类有public/private/default权限
一个成员类实例必然属于一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数
-- 约束:
静态成员类不能与外部类重名
不能在成员类中定义static字段、方法和类。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的
-- 何时使用:
方便一个类对外提供一个公共接口的实现。比如下面:
如果没有成员类机制,则只有把AbstractList暴露给未知的类去使用了。这样搞出来的实现不是“公共的”
一个静态成员类,若去掉“static”关键字,就成为成员类
下面的示例定义了四种“成员类”
public class Outer {
private int data;
// 1/4 - public权限
public class Inner1 {
private int data;
private int data1;
public Inner1() {
data1 = 1; data = 1;
Outer.this.data = 1; // 访问外部类的“实例字段”
}
}
// 2/4 - default权限
class Inner2 {
//static int j = 1; //Compile error: can not define static filed, method, class in member class
static final int CONSTANT = 1; //OK, "static final" is allowed
}
// 3/4 - private权限
private class Inner3 {
// 4/4 - 嵌套定义
public class Inner4 { }
}
// --- NOTICE ---
// Inner5 is not a member class but a static member class
interface Inner5 { }
private static void staticMethod() {
//can not create a member class instance directly in outer class' static method
//Inner1 inner1 = new Inner1();
}
private void instanceMethod() {
//can create a member class instance in outer class' instance method
Inner1 inner1 = new Inner1();
}
}
class Test {
public Test() {
//Outer.Inner2 inner2 = new Outer.Inner2(); // 不能脱离外部类而直接创造一个成员类的实例
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Inner1();
}
}
-- 特性:
类似于外部类的实例函数,成员类有public/private/default权限
一个成员类实例必然属于一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数
-- 约束:
静态成员类不能与外部类重名
不能在成员类中定义static字段、方法和类。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的
-- 何时使用:
方便一个类对外提供一个公共接口的实现。比如下面:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
// 提供给外界的公共接口
private class Itr implements Iterator<E> {
...
}
// 方便实例化,提供了一个factory方法
public Iterator<E> iterator() {
return new Itr();
}
}
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
如果没有成员类机制,则只有把AbstractList暴露给未知的类去使用了。这样搞出来的实现不是“公共的”