Javaでキーワードfinalとstaticを使った経験談


一、finalはプログラムコンテキスト環境に基づいて、Javaキーワードfinalに「これは変更できない」または「最終状態の」という意味があり、非抽象クラス、非抽象クラスメンバーメソッド、変数を修飾することができる.2つの理解から変更を阻止する必要があるかもしれません:設計または効率.finalクラスは継承できません.サブクラスはありません.finalクラスのメソッドはデフォルトでfinalです.finalメソッドは布団類のメソッドでカバーできませんが、継承できます.finalメンバー変数は定数を表し、1回のみ付与され、付与後の値は変更されません.finalは構造方法を修飾するために使用できません.注意:親クラスのprivateメンバーメソッドはクラスメソッドで上書きできないため、privateタイプのメソッドのデフォルトはfinalタイプです.1、finalクラスfinalクラスは継承できないため、finalクラスのメンバーメソッドは上書きされる機会がなく、デフォルトはfinalです.クラスを設計する際に、このクラスにサブクラスが必要でなく、クラスの実装の詳細が変更されず、このクラスが拡張されないと確信している場合はfinalクラスとして設計される.2、finalメソッドあるクラスがそのサブクラスがメソッドを上書きすることを許可しない場合、このメソッドをfinalメソッドとして宣言できます.finalメソッドを使用する理由は2つあります.第一に、メソッドをロックし、継承クラスがその意味と実現を修正することを防止します.第二に、効率的です.コンパイラはfinalメソッドの呼び出しに遭遇すると、組み込みメカニズムに移行し、実行効率を大幅に向上させます.例:
public class Test1 { 

public static void main(String[] args) { 
// TODO          
} 

public void f1() { 
System.out.println("f1"); 
} 
//           
public final void f2() { 
System.out.println("f2"); 
} 

public void f3() { 
System.out.println("f3"); 
} 

private void f4() { 
System.out.println("f4"); 
} 
} 

public class Test2 extends Test1 { 

public void f1(){ 
System.out.println("Test1    f1   !"); 
} 

public static void main(String[] args) { 
Test2 t=new Test2(); 
t.f1(); 
t.f2(); //          final   
t.f3(); //             
//t.f4(); //    ,          

} 
} 
 
3、final変数(定数)
 
final修飾のメンバー変数で定数を表し、値が与えられると変更できません!final修飾変数には,静的変数,インスタンス変数,局所変数の3種類があり,それぞれ3種類の定数を表す.次の例からfinal変数の初期値を与えると、値は変更できないことがわかります.また、final変数を定義するときは、初期値を与えずに宣言することができます.この変数はfinal空白とも呼ばれ、コンパイラはどんな場合でも、空白finalが使用する前に初期化されなければならないことを確保します.しかし、final空白はfinalキーワードfinalの使用に柔軟性を提供し、そのため、1つのクラスのfinalデータメンバーはオブジェクトによって異なるが、その一定の不変を維持する特徴を実現することができる.
package org.leizhimin; 

public class Test3 { 
private final String S="final    S"; 
private final int A=100; 
public final int B=90; 

public static final int C=80; 
private static final int D=70; 

public final int E; //final  ,               

public Test3(int x){ 
E=x; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
Test3 t=new Test3(2); 
//t.A=101; //  ,final              
//t.B=91; //  ,final              
//t.C=81; //  ,final              
//t.D=71; //  ,final              

System.out.println(t.A); 
System.out.println(t.B); 
System.out.println(t.C); //               
System.out.println(t.D); //               
System.out.println(Test3.C); 
System.out.println(Test3.D); 
//System.out.println(Test3.E); //  ,  E final  ,           . 
System.out.println(t.E); 

Test3 t1=new Test3(3); 
System.out.println(t1.E); //final    E           
} 

private void test(){ 
System.out.println(new Test3(1).A); 
System.out.println(Test3.C); 
System.out.println(Test3.D); 
} 

public void test2(){ 
final int a; //final  ,          
final int b=4; //    --final          
final int c; //final  ,       . 
a=3; 
//a=4;   ,       . 
//b=2;   ,       . 
} 
} 
 
4、finalパラメータ
 
関数パラメータがfinalタイプの場合、このパラメータを読み込むことができますが、パラメータの値を変更することはできません.
public class Test4 { 
public static void main(String[] args) { 
new Test4().f1(2); 
} 

public void f1(final int i){ 
//i++; //i final   ,       . 
System.out.print(i); 
} 
} 
 
二、static
 
staticは「グローバル」または「静的」の意味を表し、メンバー変数とメンバーメソッドを修飾するために使用され、静的staticコードブロックを形成することもできるが、Java言語にはグローバル変数の概念はない.staticによって修飾されたメンバー変数とメンバーメソッドは、クラスの任意のオブジェクトとは独立しています.すなわち、クラス固有のインスタンスに依存せず、クラスのすべてのインスタンスによって共有される.このクラスがロードされると、Java仮想マシンはクラス名に基づいて実行時のデータ領域のメソッド領域に内定して見つけることができます.したがって、staticオブジェクトは、オブジェクトを参照することなく、任意のオブジェクトが作成される前にアクセスできます.publicで修飾されたstaticメンバー変数とメンバーメソッドの本質は、クラスのオブジェクト市を宣言すると、static変数のコピーを生成するのではなく、クラスのすべてのインスタンスが同じstatic変数を共有するグローバル変数とグローバルメソッドです.static変数の前にprivate修飾があり、この変数がクラスの静的コードブロックに存在することを示す.またはクラスの他の静的メンバーメソッドで使用(もちろん非静的メンバーメソッドでも使用できます--くだらない話)しかし、他のクラスでクラス名で直接参照できないことが重要です.privateはアクセス権限制限であり、staticはインスタンス化せずに使用できることを示しているので、理解しやすいことを理解する必要があります.staticの前に他のアクセス権限キーワードを付ける効果もこのように推されます..static修飾のメンバー変数とメンバーメソッドは慣習的に静的変数と静的メソッドと呼ばれ、直接クラス名でアクセスすることができ、アクセス構文は:クラス名.静的メソッド名(パラメータリスト...)类名静的変数名はstaticで修飾されたコードブロックで静的コードブロックを表し、Java仮想マシン(JVM)がクラスをロードすると、このコードブロックが実行されます.1、static変数は静的かどうかによってクラスメンバー変数を分類して2種類に分けることができます:1つはstaticによって修飾された変数で、静的変数あるいはクラス変数と呼ばれます;もう1つはstaticに修飾されていない変数で、インスタンス変数と呼ばれます.両者の違いは:静的変数に対してメモリの中で1つのコピーしかありません(メモリの節約)、JVMは一度だけ静的メモリを割り当て、クラスのロード中に静的変数のメモリ割り当てを完了します.クラス名で直接アクセス(便利)できます.もちろん、オブジェクトからアクセスすることもできます.(ただし、これは推奨されません).インスタンス変数の場合、インスタンスが1つも作成されていないと、インスタンス変数にメモリが1回割り当てられ、インスタンス変数はメモリに複数のコピーがあり、互いに影響しません.(柔軟).2、静的メソッド静的メソッドはクラス名で直接呼び出すことができ、任意のインスタンスも呼び出すことができるため、静的メソッドではthisとsuperキーを使用することはできず、所属クラスのインスタンス変数とインスタンスメソッド(staticを持たないメンバー変数とメンバーメソッド)に直接アクセスすることはできず、所属クラスの静的メンバー変数とメンバーメソッドにのみアクセスできます.インスタンスメンバーが特定のオブジェクトに関連付けられているためです.これは理解して、その中の道理を理解して、记忆ではありません!!!staticメソッドは任意のインスタンスとは独立しているため、抽象的なabstractではなく、staticメソッドを実装する必要があります.3、staticコードブロックstaticコードブロックは静的コードブロックとも呼ばれ、クラスの中でクラスメンバーとは独立したstatic文ブロックであり、複数あってもよく、位置は自由に置くことができ、それはいかなる方法の体内にもなく、JVMがクラスをロードする時にこれらの静的コードブロックを実行し、static世代コードブロックが複数ある場合、JVMはそれらがクラスに現れる順番にそれらを実行する.各コードブロックは1回のみ実行されます.例:
public class Test5 { 
private static int a; 
private int b; 

static{ 
Test5.a=3; 
System.out.println(a); 
Test5 t=new Test5(); 
t.f(); 
t.b=1000; 
System.out.println(t.b); 
} 
static{ 
Test5.a=4; 
System.out.println(a); 
} 
public static void main(String[] args) { 
// TODO          
} 
static{ 
Test5.a=5; 
System.out.println(a); 
} 
public void f(){ 
System.out.println("hhahhahah"); 
} 
} 
 
実行結果:
 
3 hhahhahah 1000 4 5静的コードブロックを使用して、いくつかのstatic変数を割り当てることができます.最後に、これらの例を見てみると、JVMはmainメソッドを実行するときにインスタンスを作成することなく直接呼び出すことができます.4、staticとfinalは、メンバー変数とメンバーメソッドを修飾するために使用されるstatic finalを表す方法で、簡単に「グローバル定数」と理解できます.変数の場合、値が与えられると変更できず、クラス名でアクセスできることを示します.メソッドの場合は、上書きできないことを示し、クラス名で直接アクセスできます.