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;//类变量
}

メンバ変数

インスタンス変数とクラス変数に上記の変数のメンバー。メモリ内のストレージの両方の形式は、それがどのようにでしょうか?

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
  • では、ヒープメモリ、ストレージインスタンス変数、およびデフォルトの初期化を開きました。
  • スタック領域彼らは手段は、オブジェクト、二ヒープアドレス格納されているように、基準変数val0とVAL1を宣言するために、実際のオブジェクトへの参照変数ポイントを作成します。
  • 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
  • メソッド領域(ないスタック領域)すなわちstaticNum、修飾された静的変数を記憶します。
  • Val0とスタック領域に格納されVAL1二つの基準変数、それらは地域的アプローチの同じメモリ領域を指します。
  • 同じクラスでは、クラスのオブジェクトのインスタンス変数を共有しました。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とクラスローディング機構について、ここで学習した後に、深続けるヘクタールを補足されるの後、話の彼らの浅薄を表現することではありません。


ローカル変数

  • あなたはローカル変数のみを割り当てた後、彼に初期化されている定義すると、システムがメモリを与えてしまいます。
  • クラスまたはインスタンスに属していないローカル変数は、スタックは常に、メモリに保持されるため、エンドコードブロック、LIFOを持つ方法は終了します。
  • 基本データ型に特定の値を記憶し、参照されたオブジェクトのストレージの実際の型を参照するアドレス値

なお、ほとんどの時間は、あなたが問題を解決する代わりに、ローカル変数のメンバ変数の間で使用することもできますが、このアプローチにはいくつかの欠点があります:

  • 生存時間変数を増やし、メモリのオーバーヘッドが増加します。
  • プログラムの結束を改善するために助長されていません、変数のスコープを展開します。

プログラムのパフォーマンスをよりよく、ローカル変数、メモリ内の短い滞留時間の範囲より小さい。

概要

  • 特定の情報のために定義された変数は、メンバ変数を持つクラスまたはオブジェクトを記述している場合。
  • 変数は、メンバ変数と、状態情報記憶クラスまたはインスタンスの実行のために定義されている場合。
  • メンバ変数と、共有メソッド間の複数のメッセージを記憶するための定義された変数場合。

おすすめ

転載: www.cnblogs.com/summerday152/p/11966036.html