1. 類和對象的記憶體處理方式 1.1 方法區(method area) 也稱靜態區,用於存放用戶定義的各個類、靜態變數等。 1.2 堆(heap) 堆中存放對象和非靜態變數。 在使用new關鍵字產生對象後,對象會存放進堆中進行管理,對象名就是對象在堆中的地址。 對象把被它調用的成員變數直接存儲到堆中 ...
1. 類和對象的記憶體處理方式
1.1 方法區(method area)
- 也稱靜態區,用於存放用戶定義的各個類、靜態變數等。
1.2 堆(heap)
- 堆中存放對象和非靜態變數。
- 在使用new關鍵字產生對象後,對象會存放進堆中進行管理,對象名就是對象在堆中的地址。
- 對象把被它調用的成員變數直接存儲到堆中。
- 對象把被它調用的成員方法地址存儲到堆中,間接調用。
- 堆中的內容會被垃圾回收器回收。
1.3 棧(stack)
- 調用的方法都會進入到棧中(包括main方法),方法執行完成就出棧。若調用的是對象的方法,則會先進入堆中找到這個方法的地址,再根據地址進入方法區進行調用。
2. 對象作為方法的參數和返回值
-
對象可作為方法的參數
public void fun(Scanner scan){
int i = scan.nextInt();
System.out.println(i);
}
-
對象可最為方法的返回值
public Student getStu(){
Student stu = new Student();
stu.setName("XiaoMing");
stu.setAge(11);
return stu;
}
3. 成員變數和局部變數
3.1 基本特征
- 成員變數位於方法外,可供整個類使用;局部變數位於方法內,僅它所在的方法可使用。
- 成員變數有預設值null,定義時可不賦值;局部變數沒有預設值,定義時必須賦值。
3.2 記憶體管理
- 由於成員變數在類中定義,而類實例化為對象後是進入堆中,故成員變數是在堆中進行管理。
- 局部變數在方法中定義,方法是在棧中進行管理,故局部變數也在棧中進行管理。
3.3 生命周期
- 局部變數在棧中,故最終隨方法出棧以結束生命周期,周期較短。
- 成員變數在堆中,故最終以垃圾回收的方式結束周期,周期較長。
3.4 this關鍵字的使用
- 若某個類中,局部變數的名稱和成員變數名稱相同,則可使用this關鍵字對局部變數進行標識,以區分兩個變數。
- 若有多個類,則this表示的是造成重名的那個類。
4. private型變數的訪問
- 若類中有變數private int age,則在類以外無法直接訪問這個變數。
- 若要在類外訪問private型變數age,需在類中定義setAge()和getAge()兩個方法,按格式要求,變數名age的首字母必須為大寫(idea中使用alt+insert可快速創建)。
- setAge()和getAge()方法中可編寫訪問控制語句。
5. 構造方法
- 構造方法用於創建對象,若預設的構造方法無法滿足使用需求,可自定義構造方法,以替代預設方式,在創建對象時提供額外的功能(實現邏輯、為變數賦值等)。
-
自定義的構造方法名需和類名相同。定義構造方法時,無需設置返回值類型。
public class Student {
public Student (){
System.out.println("I'm a student");
};
}
-
構造方法可進行重載(可創建多個同名構造方法,方法名稱相同,但參數列表不同,使用時根據參數列表進行區分)。
public class Student {
public Student (){
System.out.println("I'm a student");
};
public Student(String name,int age){
System.out.println("My name is"+name+", I'm "+age+"years old");
}
}
-
同一個類中的無參構造方法可用this調用本類中的有參構造方法:
public class Student {
public Student (){
this("java",18) ;//無參構造方法中調用有參構造方法
System.out.println("I'm a student");
};
public Student(String name,int age){
System.out.println("My name is "+name+", I'm "+age+" years old");
}
/*輸出結果:
My name is java, I'm 18 years old
I'm a student
*/
}