更新:以下の元の回答は質問を完全に理解せずに書かれたため、質問に直接対応していません。:)
それにもかかわらず、final
キーワードの一般的な使用法を理解したいと考えている人にとって有益なものでなければなりません。
質問は、下から自分のコメントを引用したいと思います。
私は、あなたがあなた自身の実装においてそれが最終的であるかどうかを決定する自由をあなたに残すために、議論の最終性を実装することを強いられていないと信じています。
しかし、はい、final
インターフェイスで宣言できるのは奇妙に聞こえますが、実装ではそれを非最終的なものにします。次のいずれかである場合、より理にかなっています。
a。 final
キーワードは、インターフェース(抽象)メソッドの引数には許可されていません(ただし、実装で使用できます)、または
b。final
インターフェースのように引数を宣言するとfinal
、実装で強制的に宣言されます(ただし、非最終の場合は強制されません)。
メソッドシグネチャがfinal
パラメータを持つことができる2つの理由を考えることができます:Beansとオブジェクト(実際には、両方とも同じ理由ですが、コンテキストがわずかに異なります。)
オブジェクト:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
// ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth
// We forgot to add cauliflower. It went into the wrong pot.
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
// ^--- Assignment allowed...
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
//cookingPot = new StringBuilder(cookingPot.toString());
// ^---- COMPILATION ERROR! It is final.
cookingPot.append("ChickenBroth ");
}
このfinal
キーワードにより、ローカルのクッキングポットを誤って作成することがなくなり、コンパイルエラーが表示されました。これにより、addChicken
メソッドで取得したオリジナルの調理鍋にチキンブイヨンが確実に追加されます。これをaddVegetables
カリフラワーを失った場所と比較してください。カリフラワーが元の鍋ではなく、新しい地元の調理鍋に追加されたからです。
Beans:
これはオブジェクトと同じ概念です(上記を参照)。Beanは基本的Object
にJavaではです。ただし、Bean(JavaBeans)は、関連するデータの定義されたコレクションを格納して渡すための便利な方法として、さまざまなアプリケーションで使用されます。がaddVegetables
新しいクッキングポットStringBuilder
を作成してカリフラワーと一緒に捨てることでクッキングプロセスを台無しにするのと同じように、クッキングポットJavaBeanでも同じことができます。
final
ネイティブ型はコピーされるため、とにかく何もしません。