面试没答出来,写博文以记录。
先上一段代码,感受下,静态内部类与内部类的不同。
public class SingletonHolder {
SingletonHolder(){
System.out.println("singletonHolder");
}
static {
System.out.println("this is static block singletonHolder");
}
public String age = "my age is 30";
public static int age1 = 1;
public Singleton getSingleton(){
return Singleton.getSingleton();
}
public static void main(String[] arg){
SingletonHolder holder = new SingletonHolder();
holder.getSingleton();
SingletonHolder.Inner inner = holder.new Inner();
new Singleton();
}
public class Inner{
public Inner(){
System.out.println("inner");
}
public void getAge(){
System.out.println("age:"+age);
System.out.println("age:"+age1);
}
}
public static class Singleton{
public Singleton(){
System.out.println("Singleton");
}
public int getAge(){
return age1;
}
private static Singleton val ;
static {
val = new Singleton();
System.out.println("Singleton new");
}
public static Singleton getSingleton(){
return val;
}
}
}
肉眼可见的重要区别:内部类中不能编写静态代码,静态内部类可以。
其他区别:
- 内部类可以访问外部类的成员变量,静态变量。
- 静态内部类只能访问外部类的静态变量。
我们执行代码看看,看看执行结果。
发现一点有意思地方: 静态内部类构造初始化优先于他的静态代码块。