對象及其內存管理

java 內存管理分爲兩個方面:內存分配和內存回收。

內存分配:建立java對象時JVM爲 該對象在對內存中分配的內存空間。java

內存回收:java對象失去引用,變成垃圾時,jvm的垃圾回收會自動清理該對象,並回收該對象所佔用的內存。jvm

jvm的垃圾回收機制是後臺有一條線程完成,消耗內存。性能

不斷分配內存使系統中可用的內存減小,從而下降了程序的運行性能。spa

大量已分配的內存回收是的垃圾回收的負擔加劇,下降程序的運行性能。線程

 

實例變量和類變量。

變量大致分爲兩類:成員變量和局部變量。對象

局部變量分爲三類:接口

形參:參數方法簽名中定義的局部變量,有方法調用者爲其賦值,隨方法的結束而消亡 內存

 如:作用域

public String getUserName(User user){get

     return user.getName;

}user對象就是形參

方法內的局部變量:在方法內定義的局部變量,必須在方法內對其進行顯示初始化。 這種類型的局部變量從初始化完成後開始生效,隨方法的結束而消亡。

如:

public int  getAge(){

    int age = 22;

   return age;

}age 就是方法內的局部變量,隨方法的結束而消亡。

代碼塊內的局部變量:在代碼塊內定義的局部變量,必須在代碼塊內對其進行顯示初始化,這種類型的局部變量從初始化完成後開始生效,隨代碼塊的結束而結束。

如:

public static void main(String args[]) {

    {

        int x = 30;

    }

    int x = 100;

    System.out.println(x);

    }

能夠正常輸出。可是交換位置後 以下:

 public static void main(String args[]) {

         int x = 100;

        {

        int x = 30;

        }

        System.out.println(x);

}

程序會報錯。

第一種寫法:先定義了代碼塊局部變量後定義方法局部變量,代碼塊局部變量x只能做用於定義它的代碼塊,也就是說出了代碼塊該x就被銷燬了,因此後來再定義一個方法局部變量是能夠的。 
第二種寫法:先定義了方法局部變量後定義了代碼塊局部變量,方法局部變量的做用域是整個方法,出了該方法後這個方法局部變量才被銷燬,此例中,在方法局部變量還未被銷燬時就定義了相同名字的代碼塊局部變量,因此被視爲重複定義。

在定義域中定義的變量只可用於做用域結束以前。

局部變臉的做用時間很短暫,它們都被存放在棧內存中。

類體內定義的變量稱爲成員變量。若是定義該成員變量時沒有使用static 關鍵字 修飾,該成員變量又被稱爲非靜態變量或實例變量;若是使用了static修飾,則該成員變量又被稱爲靜態變量或類變量。 

static是靜態的意思,就是一個標誌,用於將實例成員變量變成類變量。static只能修飾在類裏定義的成員變量,包括成員方法,變量,內部類(枚舉和接口),初始化塊。

static只能修飾類裏面的成員,不能修飾外部類,不能修飾局部變量,局部內部類。

java 類中定義的成員變量是有前後順序的,定義成員變量時必須採用合法的前向引用。

public  class  Show{

     int num1 = num2 +1;

     int num2 = 1;

}

程序會報錯。程序是從上往下走的, num1,num2 都是成員變量。num1 須要引用num2, 而num2 還未聲明。

再如:

public class Show{

    static int num1 = num2 +1;

    static int num2 = 1;

}

程序一樣會報錯,程序是從上往下走的,num1 num2都是類變量,在類Show 初始化的時候初始化,num1 引用num2  num2 還未賦值。 非法前向引用。

以下就能夠。

public class Show{

         int num1 = num2 +1;

         static num2  = 1;

}

程序能夠正常運行,num2是類變量,隨着類Show的初始化而初始化,而num1 是實例變量,實例變量隨對象的初始化而初始化。num1 必須等到建立Show對象時纔會初始化,num2 初始化老是在num1以前。

 

實例變量和類變量的屬性

static修飾的類變量屬於類自己。沒有static修飾的成員變量是實例變量,屬於該類的實例。在同一個jvm內,每一個類只對應一個class 對象,可是每一個類能夠建立多個java對象。jvm內每個類只對應一個class 對象,所以同一個jvm 內的一個類的類變量只須要一塊內存空間,但對於實例變量來講,該類每建立一次實例,就須要爲實例變量分配一塊內存。程序有幾個該類實例,就要分配幾塊內存空間。

 

 

實例變量的初始化時機

從程序運行角度看,每次程序建立Java對象時都須要爲實例變量分配內存空間,並對實例變量進行初始化。

從語法角度看,能夠在三個地方對實例變量執行初始化

定義實例變量時指定初始值

非靜態初始化代碼塊中對實例變量初始化

構造器中對實例變量指定初始值

相關文章
相關標籤/搜索