static vs final java、どちらもJavaで異なる機能を持つ(異なる仕事に使われる)アクセス修飾子として知られているものです。
- static: static キーワードはインスタンス変数とメソッドに適用することができますが、クラスには適用できません。 適用された場合、変数とメソッドは、オブジェクトの助けを借りずに呼び出すことができます。 オブジェクトなしでメソッドや変数を呼び出すと、カプセル化は維持されません。 つまり、静的変数と静的メソッドでは、カプセル化は存在しないのです。
- final: final キーワードは変数、メソッド、クラスなどすべての構成要素に適用することができる。
I) static キーワードの使用法
一般的に、インスタンス変数やメソッドは、呼び出すオブジェクトを必要とします。 しかし、静的変数やメソッドにはオブジェクトは必要ありません。
public class Employee{ int age = 45; // non-static variable static double salary = 8877.66; // static variable public static void display() // static method { System.out.println("Hello World"); } public static void main(String args) { // System.out.println(age); // raises error, it is non-static and requires object System.out.println(salary); // works fine as salary is static, object not required display(); // works fine as display() is static, object not required }}
上記のコードで、ageは非静的で、呼び出すためにオブジェクトを必要とします。 main()メソッドは、salaryがstaticであるため、オブジェクトを必要としません。 同様に、静的なdisplay()メソッドもそうです。
II) finalキーワードの使用
先に述べたように、finalキーワードは変数、メソッド、クラスの3箇所で適用することができます。
- final変数は再代入できません。
- finalメソッドはオーバーライドできません。
- finalクラスを継承することはできません。
しかし、上記の3つに共通するのは、「finalは何かができないという意味」です。
a) 変数でのfinal
final変数はC/C++の定数と同じように機能します。 つまり、final変数は再代入できない。 Javaはconstキーワードをサポートせず、代わりにfinalキーワードを使用します。
public class Bank{ public static void main(String args) { int rupees = 500; // non-final can be reassigned System.out.println("rupees before reassigned: " + rupees); rupees = 600; // non-final System.out.println("rupees after reassigned: " + rupees); final double $rate = 61.5; // final cannot be reassigned System.out.println("$ Rate is Rs." + $rate); // $rate = 62.8; // raises error }}
変数rupeesはfinalではないので、新しい値600で再アサインされます。b) final with methods
スーパークラスがサブクラスのオーバーライドを許可しない場合、単にメソッドをfinalとして宣言します。 スーパークラスの final メソッドはサブクラスでオーバーライドできません。
class Manager{ public final void doSomeThing() // observe final { System.out.println("Do it right now"); }}public class Worker extends Manager{ public static void main(String args) { Worker w1 = new Worker(); w1.doSomeThing(); }}
スーパークラス Manager では、 doSomeThing() は final と宣言されます。 サブクラスWorkerはオーバーライドすることが許可されていません。 一度試してみましたが、コンパイルエラーが発生しました。
c) final with classes
プログラマは、あるクラスが他のクラスから継承されることを好まないかもしれない。なぜなら、継承ではなく合成によってアクセスできるようにしたいからである。
final class Fruit // observe, final class{ String nature = "Seedless";}public class Mango // extends Fruit raises compilation error{ public static void main(String args) { Fruit f1 = new Fruit(); System.out.println("Fruit type is " + f1.nature); }}
上記のコードでは、Fruit は final として宣言されており、Mango はそれを拡張することができません。 では、どのようにして Fruit クラスのメソッドを使うことができるのでしょうか。 単に Fruit のオブジェクトを作り、Fruit クラスのメソッドを呼び出せばいいのです。
What is Composition in Java?自分のクラスに他のクラスのオブジェクトを作成し、他のクラスの変数やメソッドを呼び出すことをCompositionといいます(あるクラスが他のクラスのオブジェクトを「持つ」という意味でHas-a関係と呼ばれています)。 ここで、オブジェクトとメソッドや変数は同じクラスに属している。 これに対して、継承ではオブジェクトはサブクラスに属し、変数やメソッドはスーパークラスに属します。
View All for Java Differences on 90 Topics