05 可變引數、作用域、構造器、建立物件的流程分析
可變引數
基本語法
訪問修飾符 返回型別 方法名(資料型別... 形參名){
}
例如,int... nums
int... 表示可接收的是可變引數,型別是 int;
使用可變引數時,可以當作陣列來使用,即 nums 可以當作陣列;
使用細節
- 可變引數的實參可以為0個或任意多個
- 可變引數的實參可以為陣列
- 可變引數的本質就是陣列
- 可變引數可以和普通型別的引數一起放在形參列表,但必須保證可變引數在最後
- 一個形參列表中只能出現一個可變引數
作用域的使用
- 類屬性可以被本類使用;或者透過物件呼叫被別的類使用(建立新的物件,或者直接將物件作為函式的輸入);可加修飾符
- 區域性變數只能被類中對應的方法使用;不可加修飾符
- 類屬性和區域性變數(成員方法中的定義的變數)可以重名,訪問時遵循就近原則
- 在同一個作用域中,比如在同一個成員方法中,兩個區域性變數,不能重名
- 屬性的生命週期長,伴隨著物件的建立而建立,伴隨著物件的銷燬而銷燬;
- 區域性變數的生命週期較短,伴隨著它的程式碼塊的執行而建立,伴隨著程式碼塊的結束而銷燬,即在一次方法呼叫過程中。
構造器
基本語法
[修飾符] 方法名(形參列表){
方法體;
}
修飾符可以預設;
構造器沒有返回值;
方法名和類名必須一樣;
構造器由系統自動呼叫;
使用細節
- 一個類可以定義多個不同的構造器,即構造器過載
- 如果沒有定義構造器,系統會自動給類生成一個無參構造器,比如 Dog(){}就是預設構造器 (可以透過javap反編譯看到)
- 一旦自己定義了構造器,預設構造器就被覆蓋了,無法再使用預設構造器
物件建立流程的分析
案例
class Person{
int age = 90;
String name;
Person(String n, int a){
name = n;
age = a;
}
}
Person p = new Person("小倩",20);
流程分析
1) new Person 建立物件
① 在方法區載入Person類的資訊;(只會載入一次)
② 在堆裡開闢空間(地址),裡面存放著age和name兩個屬性資訊,此時兩個屬性都為其對應型別的預設值,0和null;(預設初始化)
③ 讀取到類的屬性有賦值,於是age對應值為90;(顯示初始化);
④ 讀取到 (“小倩”,20)開始呼叫構造器,在常量池裡開闢字串空間,把屬性分別換成“小倩”,20;(構造器初始化)
2) Person p = 返回物件 把堆裡的Person物件的地址,返回到棧裡p這個物件的引用/物件名。
this關鍵字使用細節
- this關鍵字可以用來訪問本類的屬性、方法、構造器
- this關鍵字可以用來區分屬性和區域性變數
- 訪問成員方法的語法:this.方法名(引數列表),與直接 方法名(引數列表) 在繼承時會有區別
- 訪問構造器語法:this(引數列表);只能在構造器中訪問另一個構造器,且訪問語句必須放在構造器裡的第一條語句
- this不能再類定義的外部使用,只能在類定義的方法中使用