staticキーワードとその応用を詳しく述べる

2807 ワード

シーン


セグメントコードを見て、次のシーンを考えてみましょう.その実行結果は何ですか.
public class Test { static int i = 8; public void printI() { int i = 88; System.out.println(this.i); } public static void main(String arg[]) { Test t = new Test(); t.printI(); } } 

最後の実行結果は:8
このキーワードを削除すると88となりますが、もちろんここではこのキーワードについての考察があります.

staticキーワード


staticキーワードを使用して宣言された変数またはメソッドは、それを含むクラスインスタンスオブジェクトに関連付けられていません.静的ドメインまたはメソッドは、クラス宣言のオブジェクトをインスタンス化する必要がある場合ではなく、クラスインスタンス化前にメモリにロードされているため、メモリにメモリが割り当てられます.次のコードを見てみましょう.
class Test { static int i = 8; public void printI() { System.out.println("i:"+this.i); } public static void main(String arg[]) { System.out.println(Test.i); Test.test(); Test.i++; //  i Test a = new Test(); // a a.printI(); a.i++; //  i Test b = new Test();// b b.printI(); } } 

実行結果:
8
i:9
i:10
前述したように、変数iはオブジェクトのインスタンス化から離れて存在し、オブジェクトaとオブジェクトbをそれぞれ宣言しても、オブジェクトaとオブジェクトbが共通変数iであるため、aオブジェクトのiを自己増加操作した後、後のbオブジェクトは9を印刷する.

スタティツクメソッド


静的メソッドは、非静的メソッドまたは変数を呼び出すことはできません.逆に、非静的メソッドは、静的メソッドを呼び出すことができます.例:
int j = 10; public static void test() { System.out.println("j:"+ j); } 

コンパイラはこのようなエラーを提示します:Cannot make a static reference to the non-static field jで、私たちはこのようなコードを簡単に書くことができます.静的メソッドはコードを記述するのに非常に便利であることは明らかです.メソッドを呼び出すときにオブジェクトをインスタンス化する必要はありません.Utilsツールクラスをカプセル化するときによくします.これは、プログラムのパフォーマンスを向上させるのに便利です.『Effective Java』ではstatic工場の方法について詳しく説明しています.

staticの単例応用


上記のコードセグメント2で見た例と同様に、静的変数はインスタンス化する必要がなく呼び出され、修飾されたドメインは静的にメモリ内にあるため、頻繁にインスタンス化されているオブジェクトに対しては、複数回のインスタンス化を避けるために、オブジェクトを静的にすることで、プログラムのパフォーマンスの最適化を実現することができる.たとえば、WebプロジェクトでJDBCリンクオブジェクトを静的化したり、ビジネスロジック層のオブジェクトをカプセル化したり、ファクトリメソッドをカプセル化したりして、ファクトリ単例クラスを書くことがよくあります.もちろんSpringはすでにあり,反射機構を用いてこれらのBeanオブジェクトを統一的に管理することで,自動オンデマンド注入を実現している.PlayframeworkというWebを迅速に開発するフレームワークでは,そのControllerのメソッドは静的メソッドとして宣言される.単一の例を宣言する方法はいくつかあります.次のコードを参照してください.
 public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } public void test() { System.out.println("this is a test method."); } } 

クラスの構築方法はprivateキーワードで修飾され、オブジェクトがnewキーワードでインスタンス化できないことを意味します.もちろん、静的メソッドgetInstanceは、この方法でクラスの静的インスタンスオブジェクトを取得するために提供されています.このオブジェクトインスタンスは静的変数INSTANCEに保存されるため、呼び出し元は呼び出されるたびにこのインスタンスオブジェクトである.呼び出し例:
 Singleton c = Singleton.getInstance(); c.test(); //  test