3 回答

TA貢獻1839條經驗 獲得超15個贊
該final關鍵字在Java中的幾個用途。它取決于C#中的sealed和readonly關鍵字,具體取決于使用它的上下文。
班級
為了防止子類化(從已定義的類繼承):
爪哇
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
方法
防止重寫virtual方法。
爪哇
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
正如Joachim Sauer所指出的,這兩種語言之間的顯著區別是Java默認將所有非靜態方法都標記為virtual,而C#將它們標記為sealed。因此,僅sealed當您要停止進一步重寫已virtual在基類中顯式標記的方法時,才需要在C#中使用關鍵字。
變數
僅允許一次分配變量:
爪哇
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
作為邊注,所述的效果readonly關鍵詞不同于所述的const,所述關鍵字readonly表達在評價運行時,而不是編譯時,因此允許任意表達式。

TA貢獻1786條經驗 獲得超11個贊
這取決于上下文。
對于final類或方法,等效sealed于C#。
對于final字段,C#等效為readonly。
對于final局部變量或方法參數,沒有直接的C#等效項。

TA貢獻1946條經驗 獲得超3個贊
這里每個人都缺少的是Java對最終成員變量進行明確分配的保證。
對于具有最終成員變量V的類C,通過C的每個構造函數的每個可能的執行路徑都必須精確地分配一次V-未能分配V或兩次或多次分配V將導致錯誤。
C#的readonly關鍵字沒有這樣的保證-編譯器非常樂意保留未分配的只讀成員,或者允許您在構造函數中多次分配它們。
因此,final和readonly(至少在成員變量方面)絕對不相等-final更為嚴格。
添加回答
舉報