------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
構造方法,構造器(constructor)
用於給對象的數據進行初始化,每個類都有構造方法。構造方法可以重載。
默認構造方法:如果沒有定義,系統會給出默認的無參的空構造方法
構造方法的格式:
方法名與類名相同;沒有返回值類型;沒有具體的返回值,不需要寫return
構造方法的運行和作用:
創建對象時,僅執行一次;創建對象時,對成員變量初始化賦值
this 關鍵字的使用
一個構造方法可以通過this關鍵字調用另外一個重載的構造方法
this語句: 格式 this(參數列表); // 調用其他構造方法
注意:this 語句只能寫在構造方法裏面,且必須是第一行
類的初始化過程
加載 Student.class 文件進內存(方法區)
在棧內存爲引用變量 stu 開闢空間
在堆內存爲學生對象開闢空間
對學生對象的成員變量進行默認初始化
對學生對象的成員變量進行顯示初始化
通過構造方法對學生對象的成員變量賦值
學生對象初始化完畢,把對象地址賦值給 stu 變量
static 關鍵字 成員修飾符,修飾成員,不能修飾局部
靜態成員可以被類名直接調用 類名.靜態成員,非靜態成員只能被對象調用
修飾成員變量 靜態成員變量
用 static 修飾的成員變量不屬於對象的數據結構
static 變量是屬於類的變量,可以通過類名來引用 static 成員
static 成員變量和類的信息一起存儲在方法區,而不是在堆中,
一個類的 static 成員變量只有“一份”,無論該類創建了多少對象
修飾方法
static 修飾的方法不需要針對某些對象進行操作,其運行結果僅僅與輸入的參數有關,調用時直接用類名引用。
double c = Math.sqrt(3.0 * 3.0 +4.0 * 4.0);
// 該方法在調用時,沒有隱式的傳遞對象引用,因此在 static 方法中不可以使用 this 關鍵字
由於 static 在調用時沒有具體的對象,因此在 static 方法中不能對非 static 成員(對象成員)進行訪問。static 方法的作用在於提供一些“工具方法”和“工廠方法”等。
修飾代碼塊
static 塊:屬於類的代碼塊,在類加載期間執行的代碼塊,只執行一次,可以用來在軟件中加載靜態資源。
靜態成員變量和非靜態成員變量的區別:
內存位置:
靜態成員變量,存儲到方法區的靜態區
非靜態成員變量,存儲到堆內存
生命週期:
靜態成員變量,隨着類的加載而加載,隨着類的死亡而死亡,生命最長
非靜態成員變量,隨着對象的加載而加載,隨着對象的死亡而死亡,生命相對較長
調用方式:
靜態成員變量,不屬於對象,屬於自己的類,類變量通過類名直接調用
非靜態成員變量,屬於對象,只能對象調用
*作用上:
靜態成員變量,是所有對象的共享數據
非靜態成員變量,是對象的特有數據
class Person{
Stringname= "呵呵";
static String country = "China";
publicvoid show() {
System.out.println(name + country);
}
publicstaticvoid function() {
// 錯誤:無法從靜態上下文中引用非靜態變量à生命週期不一樣
/*
* 靜態方法中,使用了非靜態變量,靜態不能直接調用非靜態
* 因爲靜態成員優先於非靜態成員進入內存
*/
// System.out.println(name + country + "in static function");
}
publicstaticvoid method(){
// this 表示本類對象,靜態方法中,不能寫 this, super
// System.out.println(super);
//System.out.println(this);
// super.hashCode();
}
}
publicclassPersonDemo {
publicstaticvoid main(String[] args) {
Person.function();
}
}
類的成員變量、局部變量、實例成員變量、類成員變量
類的成員變量:定義在類中的變量
局部變量:定義在方法或語句中的變量
實例成員變量:非靜態成員變量,對象調用
類成員變量:靜態成員變量,類名調用
代碼塊:局部代碼塊,構造代碼塊,靜態代碼塊,同步代碼塊(多線程)
局部代碼塊:在方法中出現,限制變量生命週期
構造代碼塊:定義在類中方法外,多個構造方法中相同的代碼存放到一起,每次調用構造都執行,並且在構造方法前執行。
靜態代碼塊:定義在類中方法外,static 修飾符。用於給類進行初始化,在加載的時候只執行一次。
靜態代碼塊,構造代碼塊,構造方法的執行順序:
靜態代碼塊,構造代碼塊,構造方法
class Person
{
Person(){
System.out.println("構造方法");
}
{
System.out.println("構造代碼塊");
}
static{
System.out.println("靜態代碼塊");
}
public static void a(){}
}
class Code
{
public static void main(String[]args)
{
Person.a(); // 靜態代碼塊執行
new Person(); // 構造代碼塊和構造方法執行
}
}