logo

Java の static キーワード

静的キーワード Java では主にメモリ管理に使用されます。 Java の static キーワードは、特定のクラスの同じ変数またはメソッドを共有するために使用されます。ユーザーは、変数、メソッド、ブロック、およびネストされたクラスを使用して静的キーワードを適用できます。 static キーワードは、クラスのインスタンスではなくクラスに属します。 static キーワードは、クラスのすべてのインスタンスで同じ定数変数またはメソッドに使用されます。

静的 キーワードは Java の非アクセス修飾子で、次の場合に適用されます。



  1. ブロック
  2. 変数
  3. メソッド
  4. クラス

注記: 静的メンバー (ブロック、変数、メソッド、ネストされたクラス) を作成するには、その宣言の前にキーワードを付けます。 静的

np ゼロ

静的キーワードの特徴:

Java の static キーワードのいくつかの特徴を次に示します。

    共有メモリ割り当て : 静的変数とメソッドには、プログラムの実行中に 1 回だけメモリ空間が割り当てられます。このメモリ空間はクラスのすべてのインスタンス間で共有されるため、静的メンバーはグローバルな状態や共有機能を維持するのに役立ちます。オブジェクトのインスタンス化を行わずにアクセス可能: クラスのインスタンスを作成しなくても、静的メンバーにアクセスできます。これは、プログラム全体で使用できるユーティリティ関数と定数を提供するのに役立ちます。オブジェクトではなくクラスに関連付けられる: 静的メンバーは、個々のオブジェクトではなくクラスに関連付けられます。これは、静的メンバーへの変更がクラスのすべてのインスタンスに反映され、オブジェクト参照ではなくクラス名を使用して静的メンバーにアクセスできることを意味します。非静的メンバーにアクセスできない: 静的​​メソッドおよび変数は、クラスの特定のインスタンスに関連付けられていないため、クラスの非静的メンバーにアクセスできません。オーバーロードは可能ですが、オーバーライドはできません : 静的メソッドはオーバーロードできます。つまり、名前は同じでパラメーターが異なる複数のメソッドを定義できます。ただし、これらはクラスの特定のインスタンスではなくクラスに関連付けられているため、オーバーライドすることはできません。

メンバーが静的として宣言されると、そのクラスのオブジェクトが作成される前に、オブジェクトを参照せずにメンバーにアクセスできます。たとえば、以下の Java プログラムでは、静的メソッドにアクセスしています。 m1() のオブジェクトを作成せずに、 テスト クラス。



ジャワ






// Java program to demonstrate that a static member> // can be accessed before instantiating a class> class> Test> {> >// static method> >static> void> m1()> >{> >System.out.println(>'from m1'>);> >}> >public> static> void> main(String[] args)> >{> >// calling m1 without creating> >// any object of class Test> >m1();> >}> }>

>

>

出力

from m1>

静的ブロック

を初期化するために計算を行う必要がある場合は、 静的変数 を使用すると、クラスが最初にロードされたときに 1 回だけ実行される静的ブロックを宣言できます。

静的ブロックの使用を示す次の Java プログラムを考えてみましょう。

ジャワ




// Java program to demonstrate use of static blocks> class> Test> {> >// static variable> >static> int> a =>10>;> >static> int> b;> > >// static block> >static> {> >System.out.println(>'Static block initialized.'>);> >b = a *>4>;> >}> >public> static> void> main(String[] args)> >{> >System.out.println(>'from main'>);> >System.out.println(>'Value of a : '>+a);> >System.out.println(>'Value of b : '>+b);> >}> }>

>

>

出力

Static block initialized. from main Value of a : 10 Value of b : 40>

静的ブロックの詳細な記事については、「静的ブロック」を参照してください。

静的変数

変数が静的として宣言されると、変数の単一コピーが作成され、クラス レベルのすべてのオブジェクト間で共有されます。静的変数は本質的にはグローバル変数です。クラスのすべてのインスタンスは同じ静的変数を共有します。

静的変数の重要な点:

  • 静的変数はクラス レベルでのみ作成できます。ここを参照
  • 静的ブロックと静的変数は、プログラム内に存在する順序で実行されます。

以下は、静的ブロックと静的変数がプログラム内に存在する順序で実行されることを示す Java プログラムです。

ジャワ




// Java program to demonstrate execution> // of static blocks and variables> class> Test> {> >// static variable> >static> int> a = m1();> > >// static block> >static> {> >System.out.println(>'Inside static block'>);> >}> > >// static method> >static> int> m1() {> >System.out.println(>'from m1'>);> >return> 20>;> >}> > >// static method(main !!)> >public> static> void> main(String[] args)> >{> >System.out.println(>'Value of a : '>+a);> >System.out.println(>'from main'>);> >}> }>

>

>

出力

from m1 Inside static block Value of a : 20 from main>

静的メソッド

メソッドが宣言されたとき、 静的 キーワードを使用する場合、これは静的メソッドとして知られています。静的メソッドの最も一般的な例は次のとおりです。 主要( ) 方法。上で説明したように、静的メンバーは、そのクラスのオブジェクトが作成される前に、オブジェクトを参照せずにアクセスできます。静的として宣言されたメソッドには、いくつかの制限があります。

  • 他の静的メソッドのみを直接呼び出すことができます。
  • 静的データにのみ直接アクセスできます。
  • 彼らは参照することができません これ または 素晴らしい いずれにせよ。

以下は、静的メソッドの制限を示す Java プログラムです。

ジャワ




// Java program to demonstrate restriction on static methods> class> Test> {> >// static variable> >static> int> a =>10>;> > >// instance variable> >int> b =>20>;> > >// static method> >static> void> m1()> >{> >a =>20>;> >System.out.println(>'from m1'>);> > >// Cannot make a static reference to the non-static field b> >b =>10>;>// compilation error> > >// Cannot make a static reference to the> >// non-static method m2() from the type Test> >m2();>// compilation error> > >// Cannot use super in a static context> >System.out.println(>super>.a);>// compiler error> >}> > >// instance method> >void> m2()> >{> >System.out.println(>'from m2'>);> >}> > > > >public> static> void> main(String[] args)> >{> >// main method> >}> }>

>

>

出力:

prog.java:18: error: non-static variable b cannot be referenced from a static context b = 10; // compilation error ^ prog.java:22: error: non-static method m2() cannot be referenced from a static context m2(); // compilation error ^ prog.java:25: error: non-static variable super cannot be referenced from a static context System.out.println(super.a); // compiler error ^ prog.java:25: error: cannot find symbol System.out.println(super.a); // compiler error ^ symbol: variable a 4 errors>

静的変数とメソッドをいつ使用するか?

すべてのオブジェクトに共通のプロパティには静的変数を使用します。たとえば、Student クラスでは、すべての学生が同じ大学名を共有します。静的変数を変更するには静的メソッドを使用します。

の使用法を示す次の Java プログラムを考えてみましょう。 静的 キーワードと変数およびメソッド。

ジャワ


Cプログラムの文字列配列



// A java program to demonstrate use of> // static keyword with methods and variables> // Student class> class> Student {> >String name;> >int> rollNo;> >// static variable> >static> String cllgName;> >// static counter to set unique roll no> >static> int> counter =>0>;> >public> Student(String name)> >{> >this>.name = name;> >this>.rollNo = setRollNo();> >}> >// getting unique rollNo> >// through static variable(counter)> >static> int> setRollNo()> >{> >counter++;> >return> counter;> >}> >// static method> >static> void> setCllg(String name) { cllgName = name; }> >// instance method> >void> getStudentInfo()> >{> >System.out.println(>'name : '> +>this>.name);> >System.out.println(>'rollNo : '> +>this>.rollNo);> >// accessing static variable> >System.out.println(>'cllgName : '> + cllgName);> >}> }> // Driver class> public> class> StaticDemo {> >public> static> void> main(String[] args)> >{> >// calling static method> >// without instantiating Student class> >Student.setCllg(>'XYZ'>);> >Student s1 =>new> Student(>'Alice'>);> >Student s2 =>new> Student(>'Bob'>);> >s1.getStudentInfo();> >s2.getStudentInfo();> >}> }>

>

>

出力

name : Alice rollNo : 1 cllgName : XYZ name : Bob rollNo : 2 cllgName : XYZ>

d

静的クラス

クラスが作れる 静的 ネストされたクラスの場合のみ。 static 修飾子を使用してトップレベルのクラスを宣言することはできませんが、ネストされたクラスを static として宣言することはできます。このようなタイプのクラスは、ネストされた静的クラスと呼ばれます。ネストされた静的クラスには外部クラスの参照は必要ありません。この場合、静的クラスは外部クラスの非静的メンバーにアクセスできません。

注記: 静的ネストされたクラスについては、「」を参照してください。 Javaの静的なネストされたクラス

実装:

ジャワ




マージソートJava

// A java program to demonstrate use> // of static keyword with Classes> import> java.io.*;> public> class> GFG {> >private> static> String str =>'techcodeview.com'>;> >// Static class> >static> class> MyNestedClass {> > >// non-static method> >public> void> disp(){> >System.out.println(str);> >}> >}> > >public> static> void> main(String args[])> >{> >GFG.MyNestedClass obj> >=>new> GFG.MyNestedClass();> >obj.disp();> >}> }>

>

>

出力

techcodeview.com>

以下は、static キーワードの使用例を示す Java プログラムの例です。

ジャワ




public> class> ExampleClass {> >public> static> int> count =>0>;> >public> int> id;> >public> ExampleClass() {> >count++;> >id = count;> >}> >public> static> void> printCount() {> >System.out.println(>'Number of instances: '> + count);> >}> >public> void> printId() {> >System.out.println(>'Instance ID: '> + id);> >}> >public> static> void> main(String[] args) {> >ExampleClass e1 =>new> ExampleClass();> >ExampleClass e2 =>new> ExampleClass();> >ExampleClass e3 =>new> ExampleClass();> >e1.printId();> >e2.printId();> >e3.printId();> >ExampleClass.printCount();> >}> }>

>

>

出力

Instance ID: 1 Instance ID: 2 Instance ID: 3 Number of instances: 3>

利点:

    メモリ効率 : 静的メンバーにはプログラムの実行中に 1 回だけメモリが割り当てられるため、大規模なプログラムでは大幅なメモリの節約が可能になります。パフォーマンスの向上 : 静的メンバーは個々のインスタンスではなくクラスに関連付けられているため、非静的メンバーよりも迅速かつ効率的にアクセスできます。グローバル アクセシビリティ: クラスのインスタンスが作成されているかどうかに関係なく、静的メンバーにはプログラム内のどこからでもアクセスできます。ユーティリティ メソッドのカプセル化: 静的メソッドを使用すると、オブジェクトからの状態情報を必要としないユーティリティ関数をカプセル化できます。これにより、コードの構成が改善され、複数のクラス間でユーティリティ関数を再利用しやすくなります。定数 : 静的最終変数を使用して、プログラム全体で共有される定数を定義できます。クラスレベルの機能 : 静的メソッドを使用すると、ファクトリ メソッドやヘルパー関数など、オブジェクトからの状態情報を必要としないクラスレベルの機能を定義できます。

全体として、static キーワードは、Java プログラムの効率と構成の向上に役立つ強力なツールです。