Javaの静的と最終の違い
![【やさしくない!? Java】質問対応:staticの話](https://i.ytimg.com/vi/J9AFfr--a14/hqdefault.jpg)
コンテンツ
静的と最終の両方は、Javaで使用されるキーワードです。クラスオブジェクトが作成される前に、静的メンバーにアクセスできます。 Finalは、クラス、メソッド、および変数に適用すると異なる効果があります。静的キーワードと最終キーワードの主な違いは、 静的 isキーワードは、そのクラスのオブジェクトとは無関係に使用できるクラスメンバーを定義するために使用されます。 最後の キーワードは、定数変数、オーバーライドできないメソッド、および継承できないクラスを宣言するために使用されます。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | 静的 | 最後の |
---|---|---|
該当する | Staticキーワードは、ネストされた静的クラス、変数、メソッド、およびブロックに適用できます。 | finalキーワードは、クラス、メソッド、および変数に適用できます。 |
初期化 | 宣言時に静的変数を初期化することは必須ではありません。 | 宣言時に最終変数を初期化することは必須です。 |
変形 | 静的変数は再初期化できます。 | 最終変数は再初期化できません。 |
方法 | 静的メソッドは、クラスの静的メンバーにのみアクセスでき、他の静的メソッドによってのみ呼び出すことができます。 | 最終メソッドは継承できません。 |
クラス | 静的クラスオブジェクトは作成できず、静的メンバーのみが含まれます。 | 最終クラスはどのクラスにも継承できません。 |
ブロック | 静的ブロックは、静的変数を初期化するために使用されます。 | finalキーワードはそのようなブロックをサポートしていません。 |
静的の定義
静的は、クラス、変数、メソッド、およびブロックに適用可能なキーワードです。クラスメンバー、クラス、およびブロックは、それぞれクラスメンバー、クラス、およびブロックの名前の前に「static」キーワードを使用して静的にすることができます。クラスメンバが静的として宣言されると、クラスの他のすべてのメンバに対してグローバルになります。クラスの静的メンバーはインスタンスごとにメモリを占有しません。つまり、すべてのオブジェクトが静的メンバーの同じコピーを共有します。静的メンバーは、そのクラスのオブジェクトとは無関係に使用できます。オブジェクトが作成される前に、クラスの静的メンバーにアクセスできます。静的メンバーの最良の例はmain()メソッドです。これは静的と宣言されているため、オブジェクトが存在する前に呼び出すことができます。クラスの静的メンバーにアクセスする一般的な形式:
class_name.static_member //クラスの静的メンバーにアクセスします
上記のコードでは、class_nameはstatic_memberが定義されているクラスの名前です。静的メンバーは、静的変数または静的メソッドにすることができます
静的変数:
- 静的変数は、クラスの他のすべてのデータメンバーのグローバル変数のように機能します。
- クラスのオブジェクトが存在する前に、静的変数にアクセスできます。
- 静的変数には、それが定義されているクラス名の後にドット(。)演算子を付けてアクセスできます。
静的メソッド:
- 静的メソッドは、他の静的メソッドのみを呼び出すことができます。
- 静的メソッドは、静的データにのみアクセスできます。
- 静的メソッドは、どのような条件でも「this」または「super」と呼ぶことはできません。
- 静的メソッドには、定義されているクラス名の後にドット(。)演算子を続けてアクセスできます。
静的クラス:
- Javaには、ネストされた静的クラスの概念があります。最も外側のクラスを静的にすることはできませんが、最も内側のクラスを静的にすることはできます。
- 静的にネストされたクラスは、外部クラスの非静的メンバーにアクセスできません。
- 外部クラスの静的メンバーにのみアクセスできます。
静的ブロック:
静的ブロックは、クラスがロードされるときに一度だけ実行されます。クラスの静的変数を初期化するために使用されます。
C ++:
C ++には静的関数と静的変数の概念がありますが、C ++は静的クラスをサポートしていません。
C#:
C#は、静的クラス、静的変数、および静的クラスもサポートします。
Java:
Javaは、静的なネストされたクラス、静的変数、静的メソッドをサポートします。
最終の定義
Finalは、クラス、変数、およびメソッドに適用可能なキーワードです。クラス、変数、およびメソッドは、名前の後にキーワード「final」を使用してfinalとして宣言されます。変数がfinalとして宣言されると、プログラムでこれ以上変更することはできません。最終変数は、時刻の宣言時に初期化する必要があります。最終変数は、インスタンスごとにメモリを占有しません。クラスのすべてのオブジェクトは、最終変数の同じコピーを共有します。
finalとして宣言されたメソッドは、finalメソッドが宣言されているクラスのサブクラスによってオーバーライドできません。クラスがfinalとして宣言されている場合、他のクラスはそのfinalクラスを継承できません。 C ++、C#は、finalキーワードの概念をサポートしません。 Javaは、finalキーワードの概念とJavaをサポートしています。クラス、変数、およびメソッドはfinalとして宣言できます。
- staticキーワードは、ネストされた静的クラス、変数、メソッド、およびブロックに適用できます。一方、finalキーワードはクラスメソッドと変数に適用できます。
- 静的変数はいつでも初期化できますが、最終変数は宣言時に初期化する必要があります。
- 静的変数は再初期化できますが、初期化されると最終変数は再初期化できません。
- 静的メソッドは、クラスの静的メンバーにアクセスでき、他の静的メソッドによってのみ呼び出すことができます。一方、finalメソッドはどのクラスにも継承できません。
- 静的ブロックは静的変数の初期化に使用されますが、finalキーワードはブロックをサポートしません。
結論:
staticキーワードとfinalキーワードの両方は、クラス、変数、およびメソッドに適用されると、異なる目的を解決します。