目錄:
一穆桂、 概述
二、 構(gòu)造方法的重載
三融虽、 類的初始化過(guò)程
四享完、this 關(guān)鍵字
五、子父類中的構(gòu)造方法
六有额、 super 關(guān)鍵字
七般又、 static 關(guān)鍵字
八、 final 關(guān)鍵字
一巍佑、 概述
1. 構(gòu)造方法作用和定義
- 構(gòu)造方法作用:new 對(duì)象的同時(shí)給成員變量賦值茴迁,給對(duì)象屬性進(jìn)行 初始化
- 構(gòu)造方法定義:
修飾符 構(gòu)造方法名 (參數(shù)列表){
}
2. 構(gòu)造方法的特點(diǎn)
- 構(gòu)造方法 沒(méi)有返回值類型,連 void 也沒(méi)有
也不需要寫(xiě)返回值萤衰。因?yàn)樗菫闃?gòu)建對(duì)象的堕义,對(duì)象創(chuàng)建完,方法就執(zhí)行結(jié)束脆栋。
- 構(gòu)造 方法名 必須和 類名 保持一致
- 只有在 創(chuàng)建對(duì)象 的時(shí)候 自動(dòng) 調(diào)用執(zhí)行倦卖,而且只執(zhí)行 一次
3. 注意事項(xiàng)
- 每一 class 類都 必須有一個(gè)構(gòu)造方法,如果自己不寫(xiě)椿争,系統(tǒng)會(huì)給出 默認(rèn) 構(gòu)造方法
- 編譯 的時(shí)候怕膛,系統(tǒng)會(huì)自動(dòng)檢查類中是否有構(gòu)造方法,如果沒(méi)有編譯器就會(huì)自動(dòng)添加一個(gè)構(gòu)造方法
- 如果你提供了構(gòu)造方法秦踪,系統(tǒng)將不再提供默認(rèn)的構(gòu)造方法
- 構(gòu)造方法也是可以
重載
的 - 在創(chuàng)建對(duì)象時(shí)褐捻,會(huì)調(diào)用與
參數(shù)列表對(duì)應(yīng)
的構(gòu)造方法
構(gòu)造方法的內(nèi)存圖
二、 構(gòu)造方法的重載
- 一個(gè)類中可以有 多個(gè) 構(gòu)造方法洋侨,多個(gè)構(gòu)造方法是以 重載 的形式存在的
意義在于:可以根據(jù)不同的需求舍扰,定義不同的構(gòu)造方法,靈活地初始化對(duì)象的成員變量
- 構(gòu)造方法是可以被
private
修飾希坚,作用是:其他程序無(wú)法創(chuàng)建該類的對(duì)象
class Person {
private int age;
private String name;
// 私有無(wú)參數(shù)的構(gòu)造方法边苹,即外界不能通過(guò)new Person();語(yǔ)句創(chuàng)建本類對(duì)象
private Person() {
}
// 多個(gè)構(gòu)造方法是以重載的形式存在
Person(int a) {
age = a;
}
Person(String nm, int a) {
name = nm;
age = a;
}
}
三、 類的初始化過(guò)程
-
Student s = new Student();
在內(nèi)存中做了哪些事情?
- 加載
Student.class
文件進(jìn)入內(nèi)存- 在棧內(nèi)存為 s 開(kāi)辟空間
- 在堆內(nèi)存為學(xué)生對(duì)象開(kāi)辟空間
- 對(duì)學(xué)生對(duì)象的成員變量進(jìn)行默認(rèn)初始化
- 對(duì)學(xué)生對(duì)象的成員變量進(jìn)行顯示初始化
- 通過(guò)構(gòu)造方法對(duì)學(xué)生對(duì)象的成員變量賦值
- 學(xué)生對(duì)象初始化完畢裁僧,把對(duì)象地址賦值給 s 變量
-
類的初始化過(guò)程內(nèi)存圖
四个束、this 關(guān)鍵字
1. this 關(guān)鍵字:本類對(duì)象的引用
- this 是在方法中使用的,哪個(gè)對(duì)象調(diào)用了該方法聊疲,那么茬底, this 就代表調(diào)用該方法的對(duì)象引用
- this 什么時(shí)候存在的? 當(dāng)創(chuàng)建對(duì)象的時(shí)候获洲, this 就存在了
- this 的作用:用來(lái)區(qū)別同名的成員變量與局部變量(this .成員變量)
2. 成員變量隱藏
- 在局部變量作用域中阱表,如果定義了一個(gè)和成員變量同名的局部變量,此時(shí),在局部變量作用域中最爬,就無(wú)法用變量名訪問(wèn)到成員變量涉馁,而只能訪問(wèn)到同名的局部變量
- 當(dāng)需要訪問(wèn)成員變量是,只需要在成員變量前面加上
this.
即可 - 調(diào)用
其他構(gòu)造方法
的語(yǔ)句 必須 定義在構(gòu)造方法的 第一行爱致,原因是初始化動(dòng)作要 最先執(zhí)行烤送。
五、子父類中的構(gòu)造方法
1. 調(diào)用
- 在創(chuàng)建子類對(duì)象時(shí)糠悯,父類的構(gòu)造方法會(huì) 先執(zhí)行帮坚,因?yàn)樽宇愔兴袠?gòu)造方法的第一行有默認(rèn)的隱式
super();
語(yǔ)句,它是用來(lái)訪問(wèn)父類中的空參數(shù)構(gòu)造方法互艾,進(jìn)行父類成員的初始化操作 -
this()
是調(diào)用本類的構(gòu)造方法试和,super()
是調(diào)用父類的構(gòu)造方法, 且兩條語(yǔ)句 不能同時(shí)存在 - 無(wú)論如何,子類的所有構(gòu)造方法纫普,直接或間接 必須調(diào)用 到父類構(gòu)造方法; 子類的構(gòu)造方法什么都不寫(xiě)灰署,默認(rèn) 的構(gòu)造方法第一行
super()
子類初始化內(nèi)存圖:
2. 當(dāng)父類中沒(méi)有無(wú)參數(shù)構(gòu)造方法的時(shí)候,怎么辦局嘁?
- 通過(guò)
super(參數(shù))
訪問(wèn)父類有參構(gòu)造方法 - 通過(guò)
this(參數(shù))
訪問(wèn)本類中其他構(gòu)造方法
注意:本類中的其他構(gòu)造方法必須已經(jīng)能夠正常訪問(wèn)父類構(gòu)造方法
3. 為什么子類對(duì)象創(chuàng)建都要訪問(wèn)父類中的構(gòu)造方法溉箕?
- 因?yàn)樽宇惱^承了父類的內(nèi)容,所以創(chuàng)建對(duì)象時(shí)悦昵,必須要先看父類是如何對(duì)其內(nèi)容進(jìn)行初始化的肴茄。
- 所以子類在初始化時(shí),必須先到父類中去執(zhí)行父類的初始化動(dòng)作但指。這樣寡痰,才可以使用父類中的內(nèi)容。
總結(jié):子類的初始化要保證棋凳,在初始化子類成員之前拦坠,必須首先初始化父類成員,因?yàn)槭T溃宇惞δ艿膶?shí)現(xiàn)贞滨,常常會(huì)依賴父類,所以在初始化的時(shí)候拍棕,保證先初始化父類晓铆,再初始化子類
4. 創(chuàng)建子類對(duì)象過(guò)程的細(xì)節(jié)
- 如果子類的構(gòu)造方法 **第一行寫(xiě)了 this **調(diào)用了本類其他構(gòu)造方法,那么 super 調(diào)用 父類的語(yǔ)句還有嗎绰播?
這時(shí)是沒(méi)有的骄噪,因?yàn)?
this()
或者super()
,只能定義在構(gòu)造方法的第一行蠢箩,因?yàn)槌跏蓟瘎?dòng)作要先執(zhí)行链蕊。
- 父類構(gòu)造方法中是否有隱式的 super 呢事甜?
也是有的。只要是構(gòu)造方法默認(rèn)第一行都是
super();
六滔韵、 super 關(guān)鍵字
指的是父類的存儲(chǔ)空間(理解為父類的引用)
- 調(diào)用父類的成員變量:
super.成員變量;
- 調(diào)用父類的構(gòu)造方法:
super(參數(shù));
- 調(diào)用方法的成員方法:
super.成員方法();
關(guān)鍵字
super
可以在任意的非靜態(tài)方法中使用
七讳侨、 static 關(guān)鍵字
1. static 特點(diǎn)
- 被
static
修飾的成員變量 屬于類,不屬于這個(gè)類的某個(gè)對(duì)象奏属。優(yōu)先于對(duì)象存在,被類的所有對(duì)象共享
也就是說(shuō)潮峦,多個(gè)對(duì)象在訪問(wèn)或修改
static
修飾的成員變量時(shí)囱皿,其中一個(gè)對(duì)象將static
成員變量值進(jìn)行了修改,其他對(duì)象中的static
成員變量值會(huì)跟著改變忱嘹,即多個(gè)對(duì)象共享同一個(gè)static
成員變量
- 被
static
修飾的成員可以并且建議通過(guò) 類名 直接訪問(wèn)
訪問(wèn)靜態(tài)成員的格式:
- 類名.靜態(tài)成員變量名
- 類名.靜態(tài)成員方法名(參數(shù))
- 對(duì)象名.靜態(tài)成員變量名 ------不建議使用該方式嘱腥,會(huì)出現(xiàn)警告
- 對(duì)象名.靜態(tài)成員方法名(參數(shù)) -----不建議使用該方式,會(huì)出現(xiàn)警告
2. static 注意事項(xiàng)
- 靜態(tài)內(nèi)容是優(yōu)先于對(duì)象存在的拘悦,只能訪問(wèn)靜態(tài) 齿兔。靜態(tài)修飾的內(nèi)容存于內(nèi)存的 靜態(tài)區(qū)。
-
main
方法為靜態(tài)方法础米,僅僅為程序執(zhí)行入口分苇,它不屬于任何一個(gè)對(duì)象,可以定義在任意類中 - 靜態(tài)上下文中屁桑,不能引用非靜態(tài)的成員變量或成員方法
-
靜態(tài)方法中無(wú)法訪問(wèn)普通成員医寿; 靜態(tài)成員方法中,不能調(diào)用非靜態(tài)的成員方法(
靜態(tài)只能訪問(wèn)/調(diào)用靜態(tài)
) - 在靜態(tài)上下文中蘑斧,無(wú)法使用
this/super
關(guān)鍵字靖秩, 因?yàn)?this/super
指代的是對(duì)象
3. 靜態(tài)變量和成員變量的區(qū)別
-
所屬不同
- 靜態(tài)變量屬于 類,所以也稱為為 類變量竖瘾。
- 成員變量屬于 對(duì)象沟突,所以也稱為 實(shí)例變量(對(duì)象變量)
-
內(nèi)存中位置不同
- 靜態(tài)變量存儲(chǔ)于方法區(qū)的靜態(tài)區(qū)
- 成員變量存儲(chǔ)于堆內(nèi)存
-
內(nèi)存出現(xiàn)時(shí)間不同
- 靜態(tài)變量隨著 類 的加載而加載,隨著類的消失而消失
- 成員變量隨著 對(duì)象 的創(chuàng)建而存在捕传,隨著對(duì)象的消失而消失
-
調(diào)用不同
- 靜態(tài)變量可以通過(guò)類名調(diào)用惠拭,也可以通過(guò)對(duì)象調(diào)用
- 成員變量只能通過(guò) 對(duì)象名 調(diào)用
靜態(tài)變量和方法的初始化內(nèi)存圖:
4. 定義靜態(tài)常量
-
public static final
修飾的變量來(lái)完成定義,此時(shí) 變量名用全部大寫(xiě)庸论,多個(gè)單詞使用 下劃線 連接
public static final 數(shù)據(jù)類型 變量名 = 值;
- 當(dāng)我們想 使用類的靜態(tài)成員 時(shí)求橄,不需要?jiǎng)?chuàng)建對(duì)象,直接使用類名 來(lái)訪問(wèn)即可
- 接口中的每個(gè)成員變量都 默認(rèn) 使用
public static final
修飾葡公。 - 所有接口中的成員變量已是 靜態(tài)常量罐农,由于接口沒(méi)有構(gòu)造方法,所以必須 顯示 賦值催什『鳎可以直接用 接口名 訪問(wèn)。
八、 final 關(guān)鍵字
1. 概述
- 繼承的出現(xiàn)提高了代碼的復(fù)用性气筋,并方便開(kāi)發(fā)拆内。但隨之也有問(wèn)題,有些類在描述完之后宠默,不想被繼承麸恍,或者有些類中的部分方法功能是固定的,不想讓子類重寫(xiě)搀矫∧ɑΓ可是當(dāng)子類繼承了這些特殊類之后,就可以對(duì)其中的方法進(jìn)行重寫(xiě)瓤球,那怎么解決呢融欧?
- 要解決上述的這些問(wèn)題,需要使用到一個(gè)關(guān)鍵字
final
卦羡,final
的意思為最終噪馏,不可變。final
是個(gè)修飾符绿饵,它可以用來(lái)修飾 類欠肾,類的成員,以及局部變量
2. 特點(diǎn)
-
final
修飾 類 不可以被繼承拟赊,但是可以繼承其他類董济。 -
final
修飾的 方法不可以被覆蓋,但父類中沒(méi)有被final
修飾方法要门,子類覆蓋后可以加final
-
final
修飾的 變量 稱為常量虏肾,這些變量只能賦值一次。 -
final
修飾的 引用類型的變量 值為對(duì)象地址值欢搜,地址值不能更改,但是地址內(nèi)的對(duì)象屬性值可以修改 -
final
修飾 成員變量 吹埠,需要在創(chuàng)建對(duì)象前賦值廓推,否則報(bào)錯(cuò)。(當(dāng)沒(méi)有顯式賦值時(shí)樊展,多個(gè)構(gòu)造方法的均需要為其賦值。)
3. 自定義常量的初始化
- 自定義常量的初始化雷酪,可以通過(guò) 構(gòu)造方法 來(lái)初始化
注意事項(xiàng): 如果通過(guò)構(gòu)造方法淑仆,來(lái)對(duì)自定義常量進(jìn)行初始化,要保證哥力,每一個(gè)構(gòu)造方法中 都必須有初始化自定義常量的初始化語(yǔ)句