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
*/
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538928.html
標籤:其他
上一篇:Pandas太慢?快使用Vaex DataFrame,每秒數億資料算起來 ?
下一篇:day11_多型&抽象類&介面
