Java里静态类都是静态内部类。静态类可以声明普通、静态成员变量和方法,但是只能访问外部静态的成员变量和方法,不能访问外部的非静态方法和属性。普通的内部类不能声明静态成员和方法,但是可以访问外部。
还有一个就是初始化的区别,静态内部类可以单独直接初始化,就像这样:
StaticInner si = new Outer.StaticInner();
普通内部类构造方法:
Outer o = new Outer();
Inner i = o.new Inner();
什么时候需要静态内部类呢?当外部需要使用到内部类,但是内部类不需要外部类资源,并且内部类可以单独创建的时候就考虑静态内部类,同时,如果构造器有多个参数且参数可选的时候,可以使用静态内部工厂。如果不确定参数个数,也应该用建造者模式:
这是Effective Java上的例子:
public class Outer {
private String name;
private int age;
public static class Builder {
private String name;
private int age;
public Builder(int age) {
this.age = age;
}
public Builder withName(String name) {
this.name = name;
return this;
}
public Builder withAge(int age) {
this.age = age;
return this;
}
public Outer build() {
return new Outer(this);
}
}
private Outer(Builder b) {
this.age = b.age;
this.name = b.name;
}
}
静态内部类调用外部类的构造函数,来构造外部类,由于静态内部类可以被单独初始化说有在外部就有以下实现:
public Outer getOuter()
{
Outer outer = new Outer.Builder(2).withName("Yang Liu").build();
return outer;
}