回答:
final
キーワードは、Javaでいくつかの用途があります。これは、両方に対応sealed
し、readonly
それが使用される文脈に応じて、C#のキーワード。
サブクラス化(定義されたクラスからの継承)を防ぐには:
ジャワ
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が指摘するように、ここでの2つの言語の顕著な違いは、Javaはデフォルトですべての非静的メソッドをとしてvirtual
マークするのに対し、C#はそれらをとしてマークすることsealed
です。したがって、基本クラスでsealed
明示的にマークさvirtual
れているメソッドのオーバーライドをこれ以上停止しない場合は、C#でキーワードを使用するだけで済みます。
変数を1回だけ割り当てることを許可するには:
ジャワ
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
サイドノートとしての効果readonly
とは異なるキーワードconst
のキーワードは、その中でreadonly
発現がで評価されたランタイムではなく、コンパイル時したがって任意の表現を可能にします。
readonly
メンバー変数は、コンストラクターで変更できます。pastebin.com
状況によります。
final
クラスまたはメソッド、C#の同等ですsealed
。final
のフィールド、C#の同等ですreadonly
。final
ローカル変数やメソッドのパラメータ、は直接C#の同等はありません。For a final local variable or method parameter, there's no direct C# equivalent
大きな違いがあります。
const
値タイプでのみ使用できます。私が知る限り、ローカル参照型の効果的な定数を作成する方法はありません。
ここで欠けているのは、Javaによる最終メンバー変数の明確な割り当ての保証です。
最終メンバー変数Vを持つクラスCの場合、Cのすべてのコンストラクターを通るすべての実行パスは、Vを1回だけ割り当てる必要があります。Vの割り当てに失敗したり、Vを2回以上割り当てると、エラーが発生します。
C#のreadonlyキーワードにはそのような保証はありません。コンパイラーは、readonlyメンバーを未割り当てのままにするか、コンストラクター内で複数回割り当てることを許可します。
したがって、finalとreadonly(少なくともメンバー変数に関して)は明らかに同等ではありません。finalははるかに厳密です。
前述したように、sealed
はfinal
メソッドとクラスのと同等です。
残りは複雑です。
以下のためにstatic final
フィールド、static readonly
可能最も近いものです。静的コンストラクターで静的フィールドを初期化できます。これは、Javaの静的初期化子によく似ています。これは、定数(プリミティブと不変オブジェクト)と、可変オブジェクトへの定数参照の両方に適用されます。
const
修飾子は、定数のかなり似ていますが、あなたは、静的コンストラクタでそれらを設定することはできません。
readonly
使用できます。それは等しくありません- final
コンストラクタまたはイニシャライザでも正確に1つの割り当てが必要です。final
私が知っているローカル変数に相当するC#はありません。なぜだれがそれを必要とするのか疑問に思っている場合:if-else、switch-caseなどの前に変数を宣言できます。最終的に宣言することにより、割り当ては最大で1回に制限されます。
一般に、Javaローカル変数は、読み込まれる前に少なくとも1回割り当てる必要があります。値が読み取られる前に分岐が飛び出さない限り、最終的な変数は1回だけ割り当てられます。これはすべてコンパイル時にチェックされます。これには、エラーに対するマージンが少ない、適切に動作するコードが必要です。
まとめると、C#にはに直接相当するものはありませんfinal
。JavaにはC#の優れた機能がいくつかありますが、ほとんどの場合Javaプログラマーとして、C#が同等の機能を提供できない場所を確認することは、私にとっては新鮮です。
Javaクラスfinalおよびメソッドfinal->封印。Javaメンバー変数final->ランタイム定数の場合は読み取り専用、コンパイル時定数の場合はconst。
ローカル変数finalとメソッド引数finalに相当するものはありません
C#定数は、コンパイル時の定数にはconstキーワードを使用して宣言され、ランタイム定数にはreadonlyキーワードを使用して宣言されます。定数のセマンティクスは、C#言語とJava言語の両方で同じです。