JAvaのfinal修飾子と定数プール

2599 ワード

プログラミング言語を勉強するとき、変数と定数に触れたことがあります.変数は変化可能な量であり、値は可変である.定数とは、値を付与する限り、再付与は許されません.多くの人が疑問を持っていますが、私はプログラムが実行されない前にこの定数の値を変えることができるのではないでしょうか.どうして可変ではないと言いますか.定数が可変ではないのにどうして可変ではないのですか.それが可変であると仮定すると、どこに保存されていますか?また、それらの値は可変ではありませんか?
これらの問題についてご紹介します.(以下、jdk 1.8以上のメモリレイアウトが変化するため、jdk 1.7以降のバージョンに基づいて説明します)
定数プール は2つの部分に分けられる: ;静的定数プールは実行時定数プールの一部であり、静的定数プールは実行時定数プールのサブセットであると理解できます.メソッド領域に保存します.
     : .class , ( 、 、final ) , , 。
したがって,プログラミング言語では多くの字面量がコンパイル時に定数として静的定数プールに保存されていると考えられる. : , 。プログラムは、実行中に新しい定数を動的に生成し、このプールにも格納します.
たとえば、次の例を示します.
public class Test{
     
	public static void main(String[] args){
     
		for(int a=0;a<100;a++){
     
			String str=new String(a+" ");
		}
	}
}

上記のコードクリップは、定数プールに100個の定数を動的に追加します.
final修飾子
Javaではfinal修飾子はを修飾することができる.final修飾の修飾のクラスは継承できません.final修飾の方法は書き換えられませんが、書き換えのルールに従ってサブクラスで親と一致する方法を書き換えることができます.final修飾のメンバー変数は定数であり、付与されると二次付与は許可されません.
final修飾の変数も定数と呼ばれ,コンパイル時にこの値が決定される. : final , , 。