今天看到akka推薦使用靜態(tài)內(nèi)部類定義消息類型,
忽然想起內(nèi)部類和靜態(tài)內(nèi)部類有什么區(qū)別呢喊积?
親自驗證總結(jié)烹困,若有遺漏錯誤望告知,謝謝乾吻。
非靜態(tài)內(nèi)部類
- 可定義非靜態(tài)變量和常量髓梅;
- 不能定義
靜態(tài)變量
,可定義靜態(tài)常量
拟蜻; - 不能定義
靜態(tài)方法
; - 可定義非靜態(tài)方法枯饿,并且可直接訪問外部類的變量和方法 酝锅。
普通內(nèi)部類
靜態(tài)內(nèi)部類
- 可定義
靜態(tài)變量
和靜態(tài)常量
; - 可定義
靜態(tài)方法
奢方。靜態(tài)方法肯定要遵循規(guī)則只能訪問靜態(tài)變量和方法搔扁; -
可定義非靜態(tài)方法。但不能訪問外部類的非靜態(tài)變量和方法蟋字。
靜態(tài)內(nèi)部類
異同:
區(qū)別 | 非靜態(tài)內(nèi)部類 | 靜態(tài)內(nèi)部類 |
---|---|---|
定義非靜態(tài)變量和常量 | √ | √ |
定義靜態(tài)變量 | × | √ |
定義靜態(tài)常量 | √ | √ |
非靜態(tài)方法直接訪問外部類非靜態(tài)變量和方法 | √ | × |
定義靜態(tài)方法 | × | √ |
使用方式
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();
}
}
如上所示:
非靜態(tài)內(nèi)部類不能直接new稿蹲,需要外部類的對象.new
靜態(tài)內(nèi)部類可直接new