今天看到akka推荐使用静态内部类定义消息类型,
忽然想起内部类和静态内部类有什么区别呢?
亲自验证总结,若有遗漏错误望告知,谢谢。
非静态内部类
- 可定义非静态变量和常量;
- 不能定义
静态变量
,可定义静态常量
; - 不能定义
静态方法
; - 可定义非静态方法,并且可直接访问外部类的变量和方法 。
普通内部类
静态内部类
- 可定义
静态变量
和静态常量
; - 可定义
静态方法
。静态方法肯定要遵循规则只能访问静态变量和方法; -
可定义非静态方法。但不能访问外部类的非静态变量和方法。
静态内部类
异同:
区别 | 非静态内部类 | 静态内部类 |
---|---|---|
定义非静态变量和常量 | √ | √ |
定义静态变量 | × | √ |
定义静态常量 | √ | √ |
非静态方法直接访问外部类非静态变量和方法 | √ | × |
定义静态方法 | × | √ |
使用方式
public class OuterClazz {
String value;
static String static_value;
final String final_value = "final_value";
static final String static_final_value = "static_final_value";
void outerFun(){
}
static void outerStaticFun(){
}
class InnerClazz {
String inner_value;
final String inner_final_value = "final_value";
static final String inner_static_final_value = "static_final_value";
void fun() {
System.out.println(value);
System.out.println(static_value);
System.out.println(final_value);
System.out.println(static_final_value);
outerFun();
outerStaticFun();
}
}
static class StaticInnerClazz {
String inner_value;
static String inner_static_value;
final String inner_final_value = "final_value";
static final String inner_static_final_value = "static_final_value";
void fun() {
System.out.println(static_value);
System.out.println(static_final_value);
outerStaticFun();
}
static void fun2() {
System.out.println(static_value);
System.out.println(static_final_value);
outerStaticFun();
}
}
public InnerClazz getInnerInstance(){
return new InnerClazz();
}
public static void main(String[] args) {
OuterClazz co = new OuterClazz();
InnerClazz ic = co.new InnerClazz();
StaticInnerClazz sic = new OuterClazz.StaticInnerClazz();
}
}
如上所示:
非静态内部类不能直接new,需要外部类的对象.new
静态内部类可直接new
网友评论