Javaプログラミングにおけるfinal,finalize,finallyの違いを詳しく理解する
4531 ワード
final:finalはあなたのメンバー、方法、またはクラスが上書きまたは継承できるかどうかを制御することができます.これらの特徴はfinalがJavaの中で不可欠な地位を持っていることをもたらし、Javaを学ぶときに知っていなければならないキーワードの一つでもあります.finalメンバークラスで変数を定義すると、その前にfinalキーワードが追加されます.これは、この変数が初期化されると変更できません.ここで変更できないという意味は、基本タイプでは値が変更できませんが、オブジェクト変数では参照が変更できません.その初期化は、2つの場所で行うことができます.1つは定義であり、2つは構造関数であり、2つは1つしか選択できません.次のプログラムではfinalの一般的な使い方を簡単に説明します.
メソッドのパラメータをfinalとして定義する方法もあります.基本タイプの変数については、メソッドを呼び出すときに値が伝達されるため、メソッドで呼び出し文に影響を及ぼさずにこのパラメータ変数を変更できますが、オブジェクト変数については実用的です.オブジェクト変数は伝達時に参照を伝達するため、メソッドでのオブジェクト変数の変更も呼び出し文のオブジェクト変数に影響します.メソッドでパラメータとしてのオブジェクト変数を変更する必要がない場合はfinalを明確に使用して宣言すると、呼び出しメソッドに無意識の変更が影響しないようにします.また、メソッドの内部クラスがメソッドのパラメータ変数を使用する場合、次のコードに示すようにfinalとして宣言する必要があります.
finalメソッドがメソッドをfinalと宣言する理由は2つあります.1つ目は、このメソッドが提供する機能があなたの要求を満たしていることを知っていて、拡張する必要がなく、このような継承クラスからこのメソッドを上書きすることも許されていませんが、継承はこのメソッドを継承することができます.つまり、直接使用することができます.2つ目は、コンパイラがこのメソッドの呼び出しをすべてinlineに変換できるようにすることです.(行内)呼び出しのメカニズムは、finalメソッドを呼び出すときに、通常のメソッド呼び出しではなく、メソッドボディを呼び出しに直接挿入します.たとえば、ブレークポイントを保存したり、スタックを押したりすることで、プログラムの効率が向上する可能性がありますが、メソッドボディが非常に大きい場合や、複数の場所でこのメソッドを呼び出すと、呼び出しマスターコードが急速に膨張すると、かえって効率に影響を与える可能性がありますので、finalで方法定義を慎重にしてください.finalクラスfinalをクラスに使用する場合は、finalクラスは誰にも継承できないため、継承ツリーで葉クラスであることを意味し、修正や拡張を必要としない設計が完璧とされていることを考慮する必要があります.finalクラスのメンバーについては、finalとして定義するか、finalではないかを定義できます.メソッドについては,属するクラスがfinalであるため,自然とfinal型となる.finalクラスのメソッドにfinalを追加することもできますが、これは明らかに意味がありません.
finally:finallyキーワードはJava例外処理モデルに最適です.finally構造は、異常の発生の有無にかかわらず、コードを常に実行します.finallyを使用すると、オブジェクトの内部状態を維持し、メモリ以外のリソースをクリーンアップできます.finallyがないと、コードがわかりにくくなります.たとえば、finallyを使用せずに非メモリリソースを解放するためにコードを記述する方法を説明します.
このコードはFileWriter objectを作成し、writeメソッドを呼び出します.このメソッドを終了する前に、リソースの脆弱性を回避するためにFileWriter objectを閉じる必要があります.このタスクを完了するために、このメソッドの最後の文であるcloseを//2で呼び出します.しかし、tryブロックに異常が発生したらどうなるのでしょうか.この場合、//2でのclose呼び出しは永遠に発生しません.したがって、この例外をキャプチャし、この例外を再発行する前にcloseの別の呼び出しを//1に挿入する必要があります.これにより、メソッドを終了する前にFileWriter objectを閉じることが保証されます.このようにコードを書くのは面倒で間違いやすいが、finallyがない場合は欠かせない.finallyがあれば、前のコードは以下の形式に書き換えることができます.
finallyブロックは、tryブロック内で異常が発生しているかどうかにかかわらず、closeメソッドが常に実行されることを保証します.したがって、このメソッドを終了する前にcloseメソッドが常に呼び出されることを確認できます.これにより、FileWriter objectが閉じられ、リソースが漏洩していないと確信できます.
finalize:
Java言語仕様によると、JVMはfinalize関数を呼び出す前に、このオブジェクトが到達できないことを保証しますが、JVMはこの関数が必ず呼び出されることを保証しません.また、仕様はfinalize関数を最大1回実行することを保証します.
通常、finalizeは、制御が容易ではなく、I/Oの動作、データの接続など、非常に重要なリソースの解放に使用されます.これらのリソースの解放は、アプリケーション全体にとって非常に重要です.この場合、プログラマは、プログラム自体によってこれらのリソースを管理(解放を含む)することを主とし、finalize関数によってリソースを解放する方法を補助とし、finalizeだけに頼ってリソースを解放するのではなく、二重保険の管理メカニズムを形成しなければならない.
まとめ
final―修飾子(キーワード)クラスがfinalとして宣言された場合、新しいサブクラスを派生させることができず、親クラスとして継承できないことを意味します.したがって、クラスはabstractとして宣言されず、finalとして宣言されません.変数またはメソッドをfinalとして宣言すると、使用中に変更されないことが保証されます.finalとして宣言された変数は、宣言時に初期値を指定する必要があります.以降の参照では読み取りのみ、変更はできません.finalと宣言されたメソッドも同様に使用でき、再ロードできません.finally-再異常処理時にfinallyブロックを提供して消去操作を実行します.異常が投げ出されると、一致するcatch文が実行され、finallyブロック(ある場合)に制御が入ります.
finalize――メソッド名.Javaテクノロジーでは、finalize()メソッドを使用して、ゴミ収集器でオブジェクトをメモリから消去する前に必要なクリーンアップ作業を行うことができます.この方法は、このオブジェクトが参照されていないと判断したときにゴミ収集器によって呼び出されます.Objectクラスで定義されているため、すべてのクラスが継承されます.サブクラスはfinalize()メソッドを上書きして、システムリソースを整理したり、他のクリーンアップ作業を実行したりします.finalize()メソッドは、ゴミ収集器がオブジェクトを削除する前にこのオブジェクトを呼び出します.
public class Test{
final int t = 1; //
// ( )
final int t;
public Test(){
t = 3; //
}
}
メソッドのパラメータをfinalとして定義する方法もあります.基本タイプの変数については、メソッドを呼び出すときに値が伝達されるため、メソッドで呼び出し文に影響を及ぼさずにこのパラメータ変数を変更できますが、オブジェクト変数については実用的です.オブジェクト変数は伝達時に参照を伝達するため、メソッドでのオブジェクト変数の変更も呼び出し文のオブジェクト変数に影響します.メソッドでパラメータとしてのオブジェクト変数を変更する必要がない場合はfinalを明確に使用して宣言すると、呼び出しメソッドに無意識の変更が影響しないようにします.また、メソッドの内部クラスがメソッドのパラメータ変数を使用する場合、次のコードに示すようにfinalとして宣言する必要があります.
public class Test{
void print(final String str){
class InnerTest{
InnerTest (){
System.out.println(str);
}
}
InnerTest it=new InnerTest ();
}
public static void main(String[] args){
Test test=new Test();
test.print("Hello word!!!");
}
}
finalメソッドがメソッドをfinalと宣言する理由は2つあります.1つ目は、このメソッドが提供する機能があなたの要求を満たしていることを知っていて、拡張する必要がなく、このような継承クラスからこのメソッドを上書きすることも許されていませんが、継承はこのメソッドを継承することができます.つまり、直接使用することができます.2つ目は、コンパイラがこのメソッドの呼び出しをすべてinlineに変換できるようにすることです.(行内)呼び出しのメカニズムは、finalメソッドを呼び出すときに、通常のメソッド呼び出しではなく、メソッドボディを呼び出しに直接挿入します.たとえば、ブレークポイントを保存したり、スタックを押したりすることで、プログラムの効率が向上する可能性がありますが、メソッドボディが非常に大きい場合や、複数の場所でこのメソッドを呼び出すと、呼び出しマスターコードが急速に膨張すると、かえって効率に影響を与える可能性がありますので、finalで方法定義を慎重にしてください.finalクラスfinalをクラスに使用する場合は、finalクラスは誰にも継承できないため、継承ツリーで葉クラスであることを意味し、修正や拡張を必要としない設計が完璧とされていることを考慮する必要があります.finalクラスのメンバーについては、finalとして定義するか、finalではないかを定義できます.メソッドについては,属するクラスがfinalであるため,自然とfinal型となる.finalクラスのメソッドにfinalを追加することもできますが、これは明らかに意味がありません.
finally:finallyキーワードはJava例外処理モデルに最適です.finally構造は、異常の発生の有無にかかわらず、コードを常に実行します.finallyを使用すると、オブジェクトの内部状態を維持し、メモリ以外のリソースをクリーンアップできます.finallyがないと、コードがわかりにくくなります.たとえば、finallyを使用せずに非メモリリソースを解放するためにコードを記述する方法を説明します.
public void writeFile(String filePath, String fileName, String args)
throws IOException
{
FileWriter fw = new FileWriter(filePath + fileName);
try {
fw.write(args);
} catch (IOException e) {
//1
fw.close();
throw e;
}
//2
fw.close();
}
このコードはFileWriter objectを作成し、writeメソッドを呼び出します.このメソッドを終了する前に、リソースの脆弱性を回避するためにFileWriter objectを閉じる必要があります.このタスクを完了するために、このメソッドの最後の文であるcloseを//2で呼び出します.しかし、tryブロックに異常が発生したらどうなるのでしょうか.この場合、//2でのclose呼び出しは永遠に発生しません.したがって、この例外をキャプチャし、この例外を再発行する前にcloseの別の呼び出しを//1に挿入する必要があります.これにより、メソッドを終了する前にFileWriter objectを閉じることが保証されます.このようにコードを書くのは面倒で間違いやすいが、finallyがない場合は欠かせない.finallyがあれば、前のコードは以下の形式に書き換えることができます.
public void writeFile(String filePath, String fileName, String args)
throws IOException
{
FileWriter fw = new FileWriter(filePath + fileName);
try {
fw.write(args);
} catch (IOException e) {
throw e;
} finally {
fw.close();
}
}
finallyブロックは、tryブロック内で異常が発生しているかどうかにかかわらず、closeメソッドが常に実行されることを保証します.したがって、このメソッドを終了する前にcloseメソッドが常に呼び出されることを確認できます.これにより、FileWriter objectが閉じられ、リソースが漏洩していないと確信できます.
finalize:
Java言語仕様によると、JVMはfinalize関数を呼び出す前に、このオブジェクトが到達できないことを保証しますが、JVMはこの関数が必ず呼び出されることを保証しません.また、仕様はfinalize関数を最大1回実行することを保証します.
通常、finalizeは、制御が容易ではなく、I/Oの動作、データの接続など、非常に重要なリソースの解放に使用されます.これらのリソースの解放は、アプリケーション全体にとって非常に重要です.この場合、プログラマは、プログラム自体によってこれらのリソースを管理(解放を含む)することを主とし、finalize関数によってリソースを解放する方法を補助とし、finalizeだけに頼ってリソースを解放するのではなく、二重保険の管理メカニズムを形成しなければならない.
まとめ
final―修飾子(キーワード)クラスがfinalとして宣言された場合、新しいサブクラスを派生させることができず、親クラスとして継承できないことを意味します.したがって、クラスはabstractとして宣言されず、finalとして宣言されません.変数またはメソッドをfinalとして宣言すると、使用中に変更されないことが保証されます.finalとして宣言された変数は、宣言時に初期値を指定する必要があります.以降の参照では読み取りのみ、変更はできません.finalと宣言されたメソッドも同様に使用でき、再ロードできません.finally-再異常処理時にfinallyブロックを提供して消去操作を実行します.異常が投げ出されると、一致するcatch文が実行され、finallyブロック(ある場合)に制御が入ります.
finalize――メソッド名.Javaテクノロジーでは、finalize()メソッドを使用して、ゴミ収集器でオブジェクトをメモリから消去する前に必要なクリーンアップ作業を行うことができます.この方法は、このオブジェクトが参照されていないと判断したときにゴミ収集器によって呼び出されます.Objectクラスで定義されているため、すべてのクラスが継承されます.サブクラスはfinalize()メソッドを上書きして、システムリソースを整理したり、他のクリーンアップ作業を実行したりします.finalize()メソッドは、ゴミ収集器がオブジェクトを削除する前にこのオブジェクトを呼び出します.