內存分配:建立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對象時都須要爲實例變量分配內存空間,並對實例變量進行初始化。
從語法角度看,能夠在三個地方對實例變量執行初始化
定義實例變量時指定初始值
非靜態初始化代碼塊中對實例變量初始化
構造器中對實例變量指定初始值