staticとfinalの主な違いは、staticはクラスのどのオブジェクトからも独立して使用できるクラスメンバを定義するために使用されることです。
これに対してfinalは、オーバーライドできない定数変数やメソッド、継承できないクラスを宣言するために使用されます。
Staticとfinalは、Javaなどオブジェクト指向をサポートする多くのプログラミング言語で使用されているキーワードです。
Staticは変数やメソッドで使用され、それがオブジェクトではなくクラスに属することを定義します。
一方、finalは、変数やメソッド、クラスへのアクセスを制限するために使用されます。
スタティックとは
クラスは変数とメソッドで構成されています。
クラスからオブジェクトが生成され、このオブジェクトから変数やメソッドを呼び出すことができます。
クラスのメンバがstaticで宣言されている場合、メソッドや変数を呼び出すためにオブジェクトを作成する必要はありません。
その代わり、クラス名を使って呼び出すことができます。
つまり、staticはオブジェクトではなく、クラスに属するキーワードなのです。
staticキーワードを持つ変数を静的変数と呼びます。
これらは、オブジェクトの集合体に共通するプロパティを参照するために使用されます。
これらの変数は、クラスの読み込み時にメモリを取得します。
静的変数の主な利点は、メモリの節約に役立つことです。
図1: スタティック変数
上のプログラムでは、countという静的変数があります。
コンストラクタでcountは1ずつ増加します。
メインプログラムでは、3人の生徒オブジェクトが作成されます。
オブジェクトが3つあるので、countをプリントすると3という結果になります。
count 変数はすべてのオブジェクトで共有されます。
オブジェクトが作成されるたびに、カウントは1つずつ増加します。
カウントを表示するときは、クラス名と一緒に書きます(例:-Student.count)。
static キーワードを持つメソッドは、static メソッドと呼ばれます。
例として以下のようなものがあります。
図2: スタティック・メソッド
上のプログラムでは、square がスタティック・メソッドです。
これは整数値を受け取ります。
mainメソッドでは、スタティックメソッドが呼び出され、値4が渡されます。
メソッドからの答えは変数resultに格納され、最後にプリントされます。
ここでは、スタティックメソッドにアクセスするために、クラス名を使用しています。
(例 – Calculate.square(4))。
一方、静的メソッドは、非静的データメンバを使用したり、非静的メソッドを直接呼び出したりすることはできません。
静的メソッドで非静的変数を評価すると、コンパイル時エラーになります。
Finalとは
Finalとは、ユーザーを制限するためのキーワードです。
変数、メソッド、クラスで使用することができます。
Final変数は、値を変更することができません。
図3:Final変数
上のプログラムでは、変数speedLimitはfinalと宣言されています。
そのため、ドライブメソッド内でその値を変更することはできません。
そのため、エラーが表示されます。
図4: クラスA
図 5: クラス B
上のプログラムでは、クラスAはdisplayというfinalメソッドを持っています。
クラスBはクラスAを継承しているので、クラスBはクラスAのすべての変数とメソッドを継承することができ、さらにクラスBはdisplayというメソッドを持っています。
クラスAのdisplayメソッドはfinalなので、クラスBでそのメソッドをオーバーライドすることはできません。
また、finalクラスは以下のように拡張することができません。
図6:finalクラス
図7: Bクラス
Aクラスはfinalなので、Bクラスで拡張したり継承したりすることはできません。
static と final の違い
定義
Staticは、所属するクラスのインスタンス化を必要とせずにアクセスできるメンバ変数やメソッドを示すキーワードです。
これに対してfinalは、一度しか代入できない実体を表すキーワードです。
というわけで、staticとfinalの根本的な違いを説明します。
変数
static変数は再度初期化することができますが、final変数は再度初期化することができません。
これがstaticとfinalの大きな違いです。
メソッド
静的メソッドは、他の静的メソッドから呼び出され、クラスの静的メンバにのみアクセスすることができます。
一方、finalメソッドはオーバーライドすることができません。
この点もstaticとfinalの重要な違いです。
クラス
静的クラスからオブジェクトを作成することはできず、静的メンバのみから構成されます。
同様に、finalクラスは他のクラスから継承することができません。
結論
Staticは、そのクラスのどのオブジェクトからも独立して使用できるクラスメンバを定義するために使用します。
Finalは、オーバーライドできない定数変数やメソッド、継承できないクラスを宣言するときに使用されます。
これがstaticとfinalの主な違いです。