現在看看以下等價關係:
C#中的static 和Java中的static
簡單,兩者用法完全是一致的。從兩方面討論:
1. 變數是屬於類的,不是執行個體層級的。只能通過類名調用,不能通過執行個體調用。
2. 如果在定義時就賦值了,那麼在類初始化的時候,最先完成所有靜態變數的賦值。但是要注意,所有靜態變數的初始化順序是無法確定的。
C# 中的const 和Java中的finnal
很長一段時間我一直認為兩者是相同的作用,無非是變數初始化後不能更改,即只能在定義時或者建構函式中賦值。然而這僅僅只是片面的,下面將為大家詳細分析:
1.修飾變數
準確的說C#中的const 等價於 Java中的static final,也就是說,Java中final不具有static的功能。而C#中的const具有static的功能。因此在C#中 public static const string 等將於 public const string。
2.修飾類和方法
此時Java中的final類似C#中的sealed,就是說,final修飾的類不能被繼承,final修飾的方法不能被覆蓋。
而C#中的const不能修飾類和方法。
問題:
1. 私人靜態成員的作用(private static 變數)
字面表示私人的,類外不能使用;靜態,全域變數。看上去很矛盾,又不能被類外使用,要全域的有什麼用。問得好,類中全域也是很有意義的,例如 private static int a = 5,那麼就可以保證變數a在類的初始化過程中將被優先初始化(在建構函式執行之前)。這樣如果對象A的初始化需要對象B的執行個體,那麼就可以用這種申明,以保證在類A在建構函式中能夠使用類B的執行個體。同時private又能夠保證類B的執行個體只能在類A中使用,起到很好的密封作用。
2. 私人最終成員作用(private final 變數)
在類建構函式完成前必須對該成員完成初始化,一旦定義不許更改;該成員只能在本類中使用。執行個體,子類中都不能使用。
private static final修飾的成員在申明的時就被賦值,保證在建構函式中可以被使用,一個被private static final修飾的成員通常表示其他組件的一個執行個體,且變數是類中的全域變數。
private final 修飾的成員在構造中被賦值,表示它是該類全域的私人成員變數,且該類的構造需要傳入他們的初始值,才能完成類的初始化。