Javaにおけるfinalize()の詳細と使い方

5358 ワード

Javaでのfinalize()の詳細
  プログラム設計では、いくつかのデータが変更できないことを望んでいる場合があります.このときfinalは役に立つ場所があります.finalはJavaのキーワードで、「この部分は修正できません」を表しています.変えられたくない理由は2つあります.効率、設計です.finalに使用する場合は、データ、メソッド、クラスの3つです.
       一、finalデータ
       データの一定の変更が有用である場合があり、システムの稼働時の負担を軽減することができます.これらの一定不変のデータを「定数」と呼ぶことができます.定数は主に次の2つの場所に適用されます.
       1、コンパイル期間定数は、いつまでも変更できません.
       2、運行期間の初期化の時、私達はそれが変更されないことを望みます.
       コンパイル期間定数の場合、クラス・ロードのプロセスで初期化が完了しているため、クラス・ロードが完了した後は変更できません.コンパイル期間は、使用する計算式に代入できます.つまり、コンパイル期間で計算式を実行できます.もちろん、コンパイル期間定数では、基本タイプのみが使用され、定義時に初期化する必要があります.
       一部の変数では、オブジェクトによって表現が異なることを望んでいますが、変更されることを望んでいません.このとき、実行期間定数を使用することができます.実行期間定数の場合は、基本データ型でも参照データ型でもあります.基本データ型が可変でないのはその内容であり、参照データ型が可変でないのはその参照であり、参照によって指定されたオブジェクトの内容は可変である.

public class Person { 
  private String name; 
 
  Person(String name){ 
    this.name = name; 
  } 
   
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
} 
 
public class FinalTest { 
  private final String final_01 = "chenssy";  //     ,        ,      
  private final String final_02;        //     ,              
   
  private static Random random = new Random(); 
  private final int final_03 = random.nextInt(50);  //            
   
  //   
  public final Person final_04 = new Person("chen_ssy");  //final         
   
  FinalTest(String final_02){ 
    this.final_02 = final_02; 
  } 
   
  public String toString(){ 
    return "final_01 = " + final_01 +"  final_02 = " + final_02 + "  final_03 = " + final_03 + 
        "  final_04 = " + final_04.getName(); 
  } 
   
  public static void main(String[] args) { 
    System.out.println("------------       ------------"); 
    FinalTest final1 = new FinalTest("cm"); 
    System.out.println(final1); 
    System.out.println("------------       ------------"); 
    FinalTest final2 = new FinalTest("zj"); 
    System.out.println(final2); 
    System.out.println("------------      --------------"); 
    final2.final_04.setName("chenssy"); 
    System.out.println(final2); 
  } 
} 
 
------------------ 
Output: 
------------       ------------ 
final_01 = chenssy  final_02 = cm  final_03 = 34  final_04 = chen_ssy 
------------       ------------ 
final_01 = chenssy  final_02 = zj  final_03 = 46  final_04 = chen_ssy 
------------      -------------- 
final_01 = chenssy  final_02 = zj  final_03 = 46  final_04 = chenssy 

       ここでは、いくつかのデータがfinalであると思ってコンパイル期間中にその値を知ることができるとは思わないで、final_を通じて03ここでは乱数を使用して初期化され、実行期間中に値を知ることができます.
       二、final方法
       finalタグ付けされたメソッドはすべて継承、変更できないため、finalメソッドで使用される最初の理由は、サブクラスが変更されることを防止するためにメソッドがロックされることです.2つ目の原因は効率の問題であり、私たちはこの効率の問題をよく理解していない.javaの初期の実装では、1つの方法をfinalとして指定すると、コンパイラがその方法に対するすべての呼び出しを内蔵呼び出しに変更することに同意する.コンパイラはfinalメソッド呼び出しコマンドを発見すると、自分の慎重な判断に基づいて、プログラムコードを挿入するという正常な呼び出し方式をスキップしてメソッド呼び出しメカニズムを実行します(パラメータをスタックに押し込み、メソッドコードにジャンプして実行し、スタック内のパラメータをジャンプして整理し、戻り値を処理します).メソッド呼び出しの代わりに、メソッドボディ内の実際のコードのコピーを使用します.これにより、メソッド呼び出しのオーバーヘッドが解消されます.もちろん、1つの方法が大きいと、プログラムコードが膨張し、組み込みによるパフォーマンスの向上が見えない可能性があります.これは、パフォーマンスが方法内の時間量に費やされるため、削減されます.
この话に対して私がよく分からないことを理解してそのまま运んで、あのjava牛人は解釈して说明することができます!!
      親のfinalメソッドは,クラスに覆われてはいけない,すなわち,子クラスには親にそっくりなメソッドは存在できない.

public class Custom extends Person{ 
  public void method1(){ 
    System.out.println("Person's method1...."); 
  } 
   
//  Cannot override the final method from person:         final   
//  public void method2(){ 
//    System.out.println("Person's method2..."); 
//  } 
} 

      三、final類
       クラスがfinalで変更された場合、クラスが最終クラスであることを示し、他のクラスが継承されることを望んでいません.プログラム設計において安全またはその他の理由で、クラスに変化があることを許さず、サブクラスがあることを望んでいません.このときfinalを使用してクラスを修飾することができます.final修飾クラスのメンバー変数はfinalであっても非finalであってもよい.finalとして定義されている場合、finalデータのルールも同様に適しています.その方法にはfinalが自動的に加算されます.finalクラスは継承できないので、これはデフォルトです.
       四、finalパラメータ
       実際の応用では,finalでメンバー変数,メンバーメソッド,クラスを修飾するだけでなく,パラメータを修飾することもでき,あるパラメータがfinalで修飾されると,そのパラメータが変更できないことを表す.
       メソッドでパラメータを変更すると、コンパイラはあなたに「The final local variable i cannot be assigned.It must be blank and not using a compound assignment」とプロンプトします.

public class Custom { 
  public void test(final int i){ 
   //i++;   ---final       
    System.out.println(i); 
  } 
   
  public void test(final Person p){ 
   //p = new Person();  --final      
   p.setName("chenssy"); 
  } 
} 

       同じfinal修飾パラメータは内部クラスで非常に有用であり,匿名内部クラスではパラメータの整合性を保つために,存在するメソッドのパラメータが内部クラスで使用される必要がある場合,そのパラメータはfinalでなければならない.
       五、finalとstatic
       finalとstaticを一緒に使うと不思議な化学反応が発生し、彼らが同時に使うとメンバー変数を修飾したり、メンバー方法を修飾したりすることができます.
       メンバー変数の場合、この変数はいったん値を割り当てると変更できません.これをグローバル定数と呼びます.クラス名で直接アクセスできます.
       メンバーメソッドでは、継承および変更はできません.クラス名で直接アクセスできます.
 読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!