Java finalの役割と基本データ型オブジェクトの格納場所のデフォルトメカニズム

1953 ワード

興味深いコードが見えましたpublic class Test {      public static void main(String[] args)  {          String a = "hello2"          final String b = "hello" ;          String d = "hello" ;          String c = b + 2          String e = d + 2 ;          System.out.println((a == c));          System.out.println((a == e));      } }
出力結果は
true
false
ここでまず一つのことを考える
String a = "123";
String b = "123";
では、ここでa=b、trueですか、falseですか.(a==cはアドレスの比較であり、値の比較ではないと言い忘れた)
trueです.
それは、コンパイル時にString aを定義する際に付与された値が123であるため、この「123」はjavaによって暗黙的に維持されており、キャッシュされていることが理解でき、String bの場合、「123」が存在するメモリの領域を直接指し示せばよく、空間を割り当てる必要がなく、浪費を避けることができるからである.
だから上のコードString a=「hello 2」を振り返る.  
final String b = "hello";
String d = "hello";
String c = b + 2;  
String e = d + 2;
この时、あなたはコンパイラの角度に立って理解して、bはhelloで、しかもfinalの修飾を加えて、それは彼が永遠にfinalであることを意味しますか?だから私はbがhelloだと認定しました.cはhello 2ですだから私は空間を節約して、いっそcにhello 2という相手を指さすようにしました.
finalに修飾されていないdを見てみましょう.では、この時eは誰を指すべきですか?ハロー2ですか?もしdをbyeに修正したら?bye 2を保存する新しい空間を開きますか?何度も交換したり、何度もスペースを開いたりすると、メモリが大幅に浪費されます.だからjavaはそんなことはしません.だからここで、eはdを指しています.2は静的で、まったく上品ではありません.しかし、もし2も変数だったら?ではこのとき、eは同時に指向しています.eの値は、彼らが共同で決定しているので、一つ欠けてはいけません.
実は栄養のないものばかりです.しかし、finalは、この量が二度と変わらないことをコンパイラに伝えています.コンパイラはそれを知っています.そして、他の変わらない量があれば、彼はあなたのために統合します.もう1つの記憶に残る役割は、ローカル内部クラスと匿名内部クラスが外部クラスのメンバー変数を呼び出し、finalを持たなければならないことです.