StaticとFinal



Static

public class MyClass {
	public static void foo1() {}
    public void foo2() {}
}
上記2つの方法を用いた場合の違いを理解すればよい.
違いは静的で粘着しない違いです.
第1のfoo1は、MyClass.foo1();として使用することができる.
2番目のfoo2MyClass myClass = new MyClass();であり、インスタンスを生成した後にmyClass.foo2();として使用することができる.
静的は通常、すべてのインスタンスで共通するものに付着します.
静的変数と静的メソッドは、インスタンス(new)が作成されていなくてもクラスがメモリに作成されているため、すべてのインスタンスで共通しています.
ここで注意すべき点は、静的メソッドではインスタンス変数は使用できません.
たとえば、
int a, b;

static int add () {
	return a+b;
}
つまり、このような使い方はできない.int a,bはインスタンス変数であるため、インスタンスは存在しなければ使用できないが、静的メソッドはインスタンス作成なしに呼び出されるため、メソッドのみが呼び出され、インスタンスは作成できないため、int a,bは存在しない変数である可能性がある.
ここでは、JVMのメモリ構造を見て、より直感的に理解してみましょう.

Javaメモリ構造



Javaは、Java仮想マシンという仮想マシン上で実行されます..javaファイルを符号化すると、Javaコンパイラ(javac)はこのファイルをJVMが理解できるバイトコードに変換し、.classファイルを生成する.
つまりjavacは翻訳家です.
JVMをインストールすれば、OS(Windows、Mac、Linux)を考慮せずに.classファイルを実行できます.
このように翻訳された.classファイルは、JVMにおいて上図のように管理される.
一目で分かるように、メソッド領域には、さっき見た静的メソッドと変数が格納されています.さっき
静的変数、静的メソッドは、クラスがメモリに読み込まれたときに作成され、インスタンス(new)を作成する必要はありません.
私が言ったように、これがその言葉です.
したがって、ライフサイクル(Lifecycle)もクラスと同じです.
逆に、一般的な方法ではオブジェクトを作成する必要があります.newでオブジェクトを作成すると、Heap領域にオブジェクトが作成されます.次に、オブジェクトからメソッドにアクセスして呼び出すことができます.

Final


通常定数と呼ばれるもの.
finalは上書きできず、サブクラスを定義できません.
通常、インスタンス変数の場合はジェネレータで初期化できると同時に宣言および初期化できます.
ジェネレータで宣言と初期化を同時に行う場合は、各インスタンスのfinal変数に異なる値があることを確認できます.