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;//類變量
}

實例變量code

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,讓他們分別存儲兩個堆區對象的地址,意思是讓引用變量指向實際對象。
  • 兩個對象分別獨立,互不影響。

類變量對象

//直接使用類調用類變量
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。
  • 兩個引用變量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及類加載的機制,在以後的學習之中將會繼續深刻,在這裏就不發表本身的膚淺之談了,以後會進行補充哈。進程


局部變量

  • 定義局部變量時,只有對他進行初始化賦值以後,纔會得到系統給予的內存。
  • 局部變量不屬於類或實例,老是保存在棧內存中,因此隨方法或代碼塊結束而結束,後進先出。
  • 基本數據類型存放具體數值,引用類型存放實際引用對象的地址值

注意:雖然大部分時間,能夠之間用成員變量來代替局部變量解決問題,可是這種作法,有幾個缺點:內存

  • 增大變量的生存時間,增長內存開銷。
  • 擴大變量的做用域,不利於提升程序的內聚性。

局部變量的做用範圍越小,它在內存中停留的時間就越短,程序性能就會越好。作用域

總結

  • 假如定義的變量用於描述某個類或對象的固有信息,請用成員變量。
  • 假如定義的變量用於保存類或實例運行的狀態信息,請用成員變量。
  • 假如定義的變量用於保存共享在多個方法間的消息,請用成員變量。
相關文章
相關標籤/搜索