Java変数のメモリへの格納

3502 ワード

目次
  • Java変数のメモリへの格納
  • メンバー変数
  • ローカル変数
  • まとめ

  • Java変数のメモリへの格納


    以下では、メンバー変数とローカル変数のメモリへの格納について説明します.
    package com.my.pac04;
    
    /**
     * @author Summerday
     * @date 2019/12/1 13:05
     */
    public class ValStoreTest {
        public static void main(String[] args) {
            // Value ,val0 val1
            Value val0 = new Value();
            Value val1 = new Value();
            // val0 num 
            val0.num = 5;
            System.out.println("val0's num = " + val0.num);//val0'num =5
            System.out.println("val1's num = " + val1.num);//val0'num =0
            
            // 
            Value.staticNum = 10;
            // , 
            //val0.staticNum = 10;
            System.out.println("val0's staticNum =" + val0.staticNum);//10
            System.out.println("val1's staticNum =" + val1.staticNum);//10
        }
    }
    class Value {
        public int num;// 
        public static int staticNum;// 
    }
    

    メンバー変数


    前述したメンバー変数は、インスタンス変数とクラス変数に分けられます.この2つのメモリのストレージ形式はどうですか?
    class Value {
    public int num;// 
    public static int staticNum;// 
    }

    インスタンス変数
    Value val0 = new Value();
    Value val1 = new Value();
    // val0 num 
    val0.num = 5;
    System.out.println("val0's num = " + val0.num);//val0'num =5
    System.out.println("val1's num = " + val1.num);//val0'num =0
  • スタック領域にメモリを開き、インスタンス変数を格納し、デフォルトで初期化します.
  • は、スタック領域で参照変数val 0とval 1を宣言し、2つのスタック領域オブジェクトのアドレスをそれぞれ格納させ、参照変数を実際のオブジェクトに指向させることを意味する.
  • の2つのオブジェクトはそれぞれ独立しており、互いに影響しません.

  • クラス変数
    // 
    Value.staticNum = 10;
    // , 
    //val0.staticNum = 10;
    System.out.println("val0's staticNum =" + val0.staticNum);//10
    System.out.println("val1's staticNum =" + val1.staticNum);//10
  • 方法領域(スタック領域ではない)にstatic修飾の変数、すなわちstaticNumが格納される.
  • の2つの参照変数val 0およびval 1は、スタック領域に格納され、メソッド領域の同じメモリ領域を指します.
  • 同じクラスで、インスタンスオブジェクトはクラス変数を共有します.Javaプログラムが異なるJVMプロセスで実行されている場合、データは共有されません.
  • package com.my.pac04;
    /* ClassVal.java */
    public class ClassVal {
        public static int value = 6;
    }
    package com.my.pac04;
    /* ClassValTest01.java */
    public class ClassValTest01 {
        public static void main(String[] args) {
            ClassVal val01 = new ClassVal();
            val01.value = 10;// static 10
            System.out.println(val01.value);
        }
    }
    package com.my.pac04;
     /* ClassValTest02.java*/
    public class ClassValTest02 {
        public static void main(String[] args) {
            ClassVal val02 = new ClassVal();
            System.out.println(val02.value);// 10, 6
        }
    }
    

    JVMやクラスローディングの仕組みについては、その後の学習の中でさらに深く入り込みますが、ここでは自分の浅はかな話は発表せず、あとで補足しますね.

    ローカル変数

  • ローカル変数を定義する場合、システムに与えられたメモリは、初期化された割り当てが行われた後にのみ取得されます.
  • ローカル変数はクラスまたはインスタンスに属しず、常にスタックメモリに保存されるため、メソッドまたはコードブロックが終了するにつれて終了し、後進先出する.
  • 基本データ型は特定の数値を格納し、参照型は実際の参照オブジェクトのアドレス値を格納する.

  • 注意:ほとんどの時間、ローカル変数の代わりにメンバー変数を使用して問題を解決できますが、この方法にはいくつかの欠点があります.
  • 変数の生存時間を増大させ、メモリオーバーヘッドを増加させる.
  • 変数の役割ドメインを拡大し、プログラムの集約性を高めるのに不利である.

  • ローカル変数の役割範囲が小さいほど、メモリに滞留する時間が短くなり、プログラムのパフォーマンスが向上します.

    まとめ

  • 定義された変数がクラスまたはオブジェクトの固有情報を記述するために使用される場合、メンバー変数を使用します.
  • 定義された変数がクラスまたはインスタンスの実行のステータス情報を保存するために使用される場合は、メンバー変数を使用します.
  • 複数のメソッド間で共有されているメッセージを保存するために定義された変数が使用される場合は、メンバー変数を使用します.