StaticとFinal
Static
public class MyClass {
public static void foo1() {}
public void foo2() {}
}
上記2つの方法を用いた場合の違いを理解すればよい.違いは静的で粘着しない違いです.
第1の
foo1
は、MyClass.foo1();
として使用することができる.2番目の
foo2
はMyClass 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変数に異なる値があることを確認できます.
Reference
この問題について(StaticとFinal), 我々は、より多くの情報をここで見つけました https://velog.io/@hailey_dev/Static과-Finalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol