今日內(nèi)容介紹
1指郁、構(gòu)造方法
2忙上、this關(guān)鍵字
3、super關(guān)鍵字
4闲坎、綜合案例
第一節(jié)課
01(面向?qū)ο?構(gòu)造方法引入.avi 03:33
02(面向?qū)ο?構(gòu)造方法作用.avi 05:56
03(面向?qū)ο?構(gòu)造方法的定義和運(yùn)行特點(diǎn).avi 09:21
04(面向?qū)ο?默認(rèn)添加的構(gòu)造方法.avi 04:32
05(面向?qū)ο?構(gòu)造方法的調(diào)用賦值.avi 05:22
06(面向?qū)ο?構(gòu)造方法的內(nèi)存.avi 09:44
第二節(jié)課
07(面向?qū)ο?構(gòu)造方法的重載.avi 08:41
08(面向?qū)ο?構(gòu)造方法和一般方法區(qū)別.avi 02:31
09(面向?qū)ο?this在構(gòu)造方法之間的調(diào)用.avi 15:12
10(面向?qū)ο?this在構(gòu)造方法調(diào)用的內(nèi)存圖.avi 08:45
11(面向?qū)ο?this簡(jiǎn)易應(yīng)用.avi 02:12
第三節(jié)課
12(面向?qū)ο?super關(guān)鍵字_1.avi 03:02
13(面向?qū)ο?super關(guān)鍵字_2.avi 08:59
14(面向?qū)ο?子類(lèi)父類(lèi)的內(nèi)存圖.avi 16:04
15(面向?qū)ο?super關(guān)鍵字_3.avi 11:38
第四節(jié)課
16(面向?qū)ο?super關(guān)鍵字_4.avi 08:17
17(面向?qū)ο?創(chuàng)建子類(lèi)對(duì)象過(guò)程的細(xì)節(jié).avi 03:27
18(面向?qū)ο?super的應(yīng)用.avi 13:02
19(面向?qū)ο?完整員工案例分析.avi 05:50
20(面向?qū)ο?完整員工案例代碼實(shí)現(xiàn).avi 10:46
============上面的內(nèi)容,方便我們只做ppt,word教案以及書(shū)寫(xiě)下面的簡(jiǎn)要的筆記=================
=======================第一節(jié)課開(kāi)始=============================================
01構(gòu)造方法引入
* A:構(gòu)造方法的引入
在開(kāi)發(fā)中經(jīng)常需要在創(chuàng)建對(duì)象的同時(shí)明確對(duì)象的屬性值疫粥,比如員工入職公司就要明確他的姓名、年齡等屬性信息腰懂。
那么梗逮,創(chuàng)建對(duì)象就要明確屬性值,那怎么解決呢绣溜?也就是在創(chuàng)建對(duì)象的時(shí)候就要做的事情慷彤,當(dāng)使用new關(guān)鍵字創(chuàng)建對(duì)象時(shí),怎么給對(duì)象的屬性初始化值呢怖喻?
這就要學(xué)習(xí)Java另外一門(mén)小技術(shù)底哗,構(gòu)造方法。
* B: 那什么是構(gòu)造方法呢锚沸?
從字面上理解即為構(gòu)建創(chuàng)造時(shí)用的方法艘虎,即就是對(duì)象創(chuàng)建時(shí)要執(zhí)行的方法。既然是對(duì)象創(chuàng)建時(shí)要執(zhí)行的方法咒吐,那么只要在new對(duì)象時(shí)野建,
知道其執(zhí)行的構(gòu)造方法是什么,就可以在執(zhí)行這個(gè)方法的時(shí)候給對(duì)象進(jìn)行屬性賦值恬叹。
02構(gòu)造方法作用
* A: 構(gòu)造方法的作用:
在new的同時(shí)給成員變量賦值,給對(duì)象屬性進(jìn)行初始化候生。
* B: 舉例:
Perons p = new Person("張三",23); 在new 的時(shí)候給p對(duì)象的name屬性和age屬性進(jìn)行賦值,使這個(gè)對(duì)象的屬性有值。
?
03構(gòu)造方法的定義和運(yùn)行特點(diǎn)
* A: 構(gòu)造方法定義
構(gòu)造方法的格式:
修飾符 構(gòu)造方法名(參數(shù)列表)
{
}
* B: 構(gòu)造方法的體現(xiàn):
構(gòu)造方法沒(méi)有返回值類(lèi)型绽昼。也不需要寫(xiě)返回值唯鸭。因?yàn)樗菫闃?gòu)建對(duì)象的,對(duì)象創(chuàng)建完硅确,方法就執(zhí)行結(jié)束目溉。
構(gòu)造方法名稱(chēng)必須和類(lèi)型保持一致明肮。
構(gòu)造方法沒(méi)有具體的返回值。
構(gòu)造方法的代碼體現(xiàn):
* C: 構(gòu)造方法舉例
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構(gòu)造方法缭付,擁有參數(shù)列表
Person(int a, String nm) {
// 接受到創(chuàng)建對(duì)象時(shí)傳遞進(jìn)來(lái)的值柿估,將值賦給成員屬性
age = a;
name = nm;
}
}
* D: 構(gòu)造方法運(yùn)行特點(diǎn):
在new 對(duì)象的時(shí)候自動(dòng)調(diào)用執(zhí)行。
04默認(rèn)添加的構(gòu)造方法
* A: 每一class類(lèi)都必須有一個(gè)構(gòu)造方法陷猫,構(gòu)造方法不寫(xiě)也有秫舌。
編譯的時(shí)候,javac绣檬,系統(tǒng)會(huì)自動(dòng)檢查類(lèi)中是否有構(gòu)造方法足陨,如果沒(méi)有編譯器就會(huì)自動(dòng)添加一個(gè)構(gòu)造方法
比如Person類(lèi), 編譯器添加一個(gè)無(wú)參構(gòu)造 public Person(){}
05構(gòu)造方法的調(diào)用賦值
* A: 理解構(gòu)造方法的格式和基本功能之后娇未,現(xiàn)在就要研究構(gòu)造方法是怎么執(zhí)行的呢墨缘?在創(chuàng)建對(duì)象的時(shí)候是如何初始化的呢?
構(gòu)造方法是專(zhuān)門(mén)用來(lái)創(chuàng)建對(duì)象的零抬,也就是在new對(duì)象時(shí)要調(diào)用構(gòu)造方法∧魉希現(xiàn)在來(lái)看看如何調(diào)用構(gòu)造方法。
* B: 案例
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構(gòu)造方法媚值,擁有參數(shù)列表
Person(int a, String nm) {
// 接受到創(chuàng)建對(duì)象時(shí)傳遞進(jìn)來(lái)的值狠毯,將值賦給成員屬性
age = a;
name = nm;
}
public void speak() {
System.out.println("name=" + name + ",age=" + age);
}
}
class PersonDemo {
public static void main(String[] args) {
// 創(chuàng)建Person對(duì)象,并明確對(duì)象的年齡和姓名
Person p2 = new Person(23, "張三");
p2.speak();
}
}
上述代碼演示了創(chuàng)建對(duì)象時(shí)構(gòu)造方法的調(diào)用褥芒。即在創(chuàng)建對(duì)象時(shí)嚼松,會(huì)調(diào)用與參數(shù)列表對(duì)應(yīng)的構(gòu)造方法
06構(gòu)造方法的內(nèi)存
A:內(nèi)存加載的過(guò)程
有一個(gè)Person類(lèi), 創(chuàng)建Person 對(duì)象new Person()
1、首先會(huì)將main方法壓入棧中锰扶,執(zhí)行main方法中的 new Person(23,"張三");
2献酗、在堆內(nèi)存中分配一片區(qū)域,用來(lái)存放創(chuàng)建的Person對(duì)象坷牛,這片內(nèi)存區(qū)域會(huì)有屬于自己的內(nèi)存地址(0x88)罕偎。然后給成員變量進(jìn)行默認(rèn)初始化(name=null,age=0)京闰。
3颜及、執(zhí)行構(gòu)造方法中的代碼(age = a ; name = nm;),將變量a對(duì)應(yīng)的23賦值給age,將變量nm對(duì)應(yīng)的”張三賦值給name蹂楣,這段代碼執(zhí)行結(jié)束后俏站,成員變量age和name的值已經(jīng)改變。執(zhí)行結(jié)束之后構(gòu)造方法彈棧痊土,Person對(duì)象創(chuàng)建完成肄扎。將Person對(duì)象的內(nèi)存地址0x88賦值給p2。
==============================第二節(jié)課開(kāi)始====================================
07構(gòu)造方法的重載
* A:當(dāng)在描述事物時(shí),要不要在類(lèi)中寫(xiě)構(gòu)造方法呢犯祠?這時(shí)要根據(jù)描述事物的特點(diǎn)來(lái)確定旭等,當(dāng)描述的事物在創(chuàng)建其對(duì)象時(shí)就要明確屬性的值,這時(shí)就需要在定義類(lèi)的時(shí)候書(shū)寫(xiě)帶參數(shù)的構(gòu)造方法衡载。
* 若創(chuàng)建對(duì)象時(shí)不需要明確具體的數(shù)據(jù)搔耕,這時(shí)可以不用書(shū)寫(xiě)構(gòu)造方法(不書(shū)寫(xiě)也有默認(rèn)的構(gòu)造方法)。
構(gòu)造方法的細(xì)節(jié):
1月劈、一個(gè)類(lèi)中可以有多個(gè)構(gòu)造方法度迂,多個(gè)構(gòu)造方法是以重載的形式存在的
2藤乙、構(gòu)造方法是可以被private修飾的猜揪,作用:其他程序無(wú)法創(chuàng)建該類(lèi)的對(duì)象。
* B: 舉例
class Person {
private int age;
private String name;
// 私有無(wú)參數(shù)的構(gòu)造方法坛梁,即外界不能通過(guò)new Person();語(yǔ)句創(chuàng)建本類(lèi)對(duì)象
private Person() {
}
// 多個(gè)構(gòu)造方法是以重載的形式存在
Person(int a) {
age = a;
}
Person(String nm, int a) {
name = nm;
age = a;
}
}
?
08構(gòu)造方法和一般方法區(qū)別
* A: 目前為止而姐,學(xué)習(xí)兩種方法,分別為構(gòu)造方法和一般方法划咐,那么他們之間有什么異同呢拴念?
1.格式不同
構(gòu)造方法 : 修飾符 類(lèi)名(參數(shù)類(lèi)型 參數(shù) ...){
初始化成員變量
}
一般方法: 需要有返回值類(lèi)型
2.作用不同
構(gòu)造方法一般用來(lái)給成員變量初始化;
一般方法根據(jù)需求而定;
3.調(diào)用方式不同
構(gòu)造方法創(chuàng)建對(duì)象時(shí)調(diào)用, 或者this() super() 語(yǔ)句調(diào)用
普通方法需要對(duì)象調(diào)用或者靜態(tài)方法直接調(diào)用靜態(tài)方法.
4.執(zhí)行不同
構(gòu)造方法在對(duì)象創(chuàng)建時(shí)就執(zhí)行了,而且只執(zhí)行一次褐缠。
一般方法是在對(duì)象創(chuàng)建后政鼠,需要使用時(shí)才被對(duì)象調(diào)用,并可以被多次調(diào)用队魏。
?
09this在構(gòu)造方法之間的調(diào)用
* A: 在之前學(xué)習(xí)方法之間調(diào)用時(shí)公般,可以通過(guò)方法名進(jìn)行調(diào)用『埃可是針對(duì)構(gòu)造方法官帘,無(wú)法通過(guò)構(gòu)造方法名來(lái)相互調(diào)用。
構(gòu)造方法之間的調(diào)用昧谊,可以通過(guò)this關(guān)鍵字來(lái)完成刽虹。
構(gòu)造方法調(diào)用格式:
this(參數(shù)列表);
* B:調(diào)用構(gòu)造方法的案例
class Person {
// Person的成員屬性
private int age;
private String name;
// 無(wú)參數(shù)的構(gòu)造方法
Person() {
}
// 給姓名初始化的構(gòu)造方法
Person(String nm) {
name = nm;
}
// 給姓名和年齡初始化的構(gòu)造方法
Person(String nm, int a) {
// 由于已經(jīng)存在給姓名進(jìn)行初始化的構(gòu)造方法 name = nm;因此只需要調(diào)用即可
// 調(diào)用其他構(gòu)造方法,需要通過(guò)this關(guān)鍵字來(lái)調(diào)用
this(nm);
// 給年齡初始化
age = a;
}
}
10this在構(gòu)造方法調(diào)用的內(nèi)存圖
* A: 被加載的代碼
class Person {
private int age;
private String name;
Person() {
}
Person(String nm) {
name = nm;
}
Person(String nm, int a) {
this(nm);
age = a;
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("張三", 23);
}
}
* B: 構(gòu)造方法調(diào)用的原理圖
* 圖略
1呢诬、先執(zhí)行main方法涌哲,main方法壓棧,執(zhí)行其中的new Person(“張三”,23);
2尚镰、堆內(nèi)存中開(kāi)辟空間阀圾,并為其分配內(nèi)存地址0x33,钓猬,緊接著成員變量默認(rèn)初始化(name=null age = 0)稍刀;
3、擁有兩個(gè)參數(shù)的構(gòu)造方法(Person(String nm , int a))壓棧,在這個(gè)構(gòu)造方法中有一個(gè)隱式的this账月,因?yàn)闃?gòu)造方法是給對(duì)象初始化的综膀,那個(gè)對(duì)象調(diào)用到這個(gè)構(gòu)造方法,this就指向堆中的那個(gè)對(duì)象局齿。
4剧劝、由于Person(String nm , int a)構(gòu)造方法中使用了this(nm);構(gòu)造方法Person(String nm)就會(huì)壓棧,并將“張三”傳遞給nm抓歼。在Person(String nm , int a)構(gòu)造方法中同樣也有隱式的this讥此,this的值同樣也為0x33,這時(shí)會(huì)執(zhí)行其中name = nm谣妻,即把“張三”賦值給成員的name萄喳。當(dāng)賦值結(jié)束后Person(String nm , int a)構(gòu)造方法彈棧。
5蹋半、程序繼續(xù)執(zhí)行構(gòu)造方法(Person(String nm , int a)中的age = a他巨;這時(shí)會(huì)將23賦值給成員屬性age。賦值結(jié)束構(gòu)造方法(Person(String nm , int a)彈棧减江。
6染突、當(dāng)構(gòu)造方法(Person(String nm , int a)彈棧結(jié)束后,Person對(duì)象在內(nèi)存中創(chuàng)建完成辈灼,并將0x33賦值給main方法中的p引用變量份企。
注意:
this到底代表什么呢?this代表的是對(duì)象巡莹,具體代表哪個(gè)對(duì)象呢司志?哪個(gè)對(duì)象調(diào)用了this所在的方法,this就代表哪個(gè)對(duì)象榕莺。
調(diào)用其他構(gòu)造方法的語(yǔ)句必須定義在構(gòu)造方法的第一行俐芯,原因是初始化動(dòng)作要最先執(zhí)行。
11this簡(jiǎn)易應(yīng)用
* A: 當(dāng)在方法中出現(xiàn)了局部變量和成員變量同名的時(shí)候钉鸯,那么在方法中怎么區(qū)別局部變量成員變量呢吧史?可以在成員變量名前面加上this.來(lái)區(qū)別成員變量和局部變量
* B: 舉例1
class Person {
private int age;
private String name;
// 給姓名和年齡初始化的構(gòu)造方法
Person(String name, int age) {
// 當(dāng)需要訪問(wèn)成員變量是,只需要在成員變量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("張三", 23);
p.speak();
}
}
* C: 舉例2
學(xué)習(xí)完了構(gòu)造方法唠雕、this的用法之后贸营,現(xiàn)在做個(gè)小小的練習(xí)。
需求:在Person類(lèi)中定義功能岩睁,判斷兩個(gè)人是否是同齡人
class Person {
private int age;
private String name;
// 給姓名和年齡初始化的構(gòu)造方法
Person(String name, int age) {
// 當(dāng)需要訪問(wèn)成員變量是钞脂,只需要在成員變量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
// 判斷是否為同齡人
public boolean equalsAge(Person p) {
// 使用當(dāng)前調(diào)用該equalsAge方法對(duì)象的age和傳遞進(jìn)來(lái)p的age進(jìn)行比較
// 由于無(wú)法確定具體是哪一個(gè)對(duì)象調(diào)用equalsAge方法,這里就可以使用this來(lái)代替
/*
* if(this.age == p.age) { return true; } return false;
*/
return this.age = p.age;
}
}
==============================第三節(jié)課開(kāi)始====================================
?
12super關(guān)鍵字_1
* A: 子父類(lèi)中構(gòu)造方法的調(diào)用
在創(chuàng)建子類(lèi)對(duì)象時(shí)捕儒,父類(lèi)的構(gòu)造方法會(huì)先執(zhí)行冰啃,因?yàn)樽宇?lèi)中所有構(gòu)造方法的第一行有默認(rèn)的隱式super();語(yǔ)句邓夕。
* B: 格式:
調(diào)用本類(lèi)中的構(gòu)造方法
this(實(shí)參列表);
調(diào)用父類(lèi)中的空參數(shù)構(gòu)造方法
super();
調(diào)用父類(lèi)中的有參數(shù)構(gòu)造方法
super(實(shí)參列表);
13super關(guān)鍵字_2
* A:子類(lèi)構(gòu)造方法,有一個(gè)默認(rèn)添加的構(gòu)造方法
public class Student extends Person {
public Student(){
super();
}
}
* B :為什么子類(lèi)對(duì)象創(chuàng)建都要訪問(wèn)父類(lèi)中的構(gòu)造方法?因?yàn)樽宇?lèi)繼承了父類(lèi)的內(nèi)容阎毅,所以創(chuàng)建對(duì)象時(shí)焚刚,必須要先看父類(lèi)是如何對(duì)其內(nèi)容進(jìn)行初始化的,看如下程序
public class Test {
public static void main(String[] args) {
new Zi();
}
}
class Fu{
int num ;
Fu(){
System.out.println("Fu構(gòu)造方法"+num);
num = 4;
}
}
class Zi extends Fu{
Zi(){
//super(); 調(diào)用父類(lèi)空參數(shù)構(gòu)造方法
System.out.println("Zi構(gòu)造方法"+num);
}
}
執(zhí)行結(jié)果:
Fu構(gòu)造方法0
Zi構(gòu)造方法4
通過(guò)結(jié)果發(fā)現(xiàn)扇调,子類(lèi)構(gòu)造方法執(zhí)行時(shí)中矿咕,調(diào)用了父類(lèi)構(gòu)造方法,這說(shuō)明狼钮,子類(lèi)構(gòu)造方法中有一句super()碳柱。
那么,子類(lèi)中的構(gòu)造方法為什么會(huì)有一句隱式的super()呢熬芜?
原因:子類(lèi)會(huì)繼承父類(lèi)中的內(nèi)容莲镣,所以子類(lèi)在初始化時(shí),必須先到父類(lèi)中去執(zhí)行父類(lèi)的初始化動(dòng)作猛蔽。這樣剥悟,才可以使用父類(lèi)中的內(nèi)容灵寺。
當(dāng)父類(lèi)中沒(méi)有空參數(shù)構(gòu)造方法時(shí)曼库,子類(lèi)的構(gòu)造方法必須有顯示的super語(yǔ)句,指定要訪問(wèn)的父類(lèi)有參數(shù)構(gòu)造方法略板。
14子類(lèi)父類(lèi)的內(nèi)存圖
略:
具體見(jiàn) day12_source/子類(lèi)父類(lèi)的內(nèi)存圖.JPG
15super關(guān)鍵字_3
* A: 創(chuàng)建子類(lèi)對(duì)象的時(shí)候會(huì)必須調(diào)用父類(lèi)的構(gòu)造方法毁枯。
子類(lèi)默認(rèn)會(huì)調(diào)用父類(lèi)的無(wú)參構(gòu)造, 但如果父類(lèi)沒(méi)有無(wú)參構(gòu)造叮称,子類(lèi)的構(gòu)造方法繼續(xù)調(diào)用父類(lèi)的無(wú)參構(gòu)造就會(huì)報(bào)錯(cuò)种玛。
因此子類(lèi)構(gòu)造方法的第一行需要調(diào)用父類(lèi)的構(gòu)造方法,既可以調(diào)用父類(lèi)的無(wú)參構(gòu)造瓤檐,也可以調(diào)用父類(lèi)的有參構(gòu)造赂韵,這樣語(yǔ)法上就不會(huì)報(bào)錯(cuò)。
16super關(guān)鍵字_4
* A: 構(gòu)造方法第一行,寫(xiě)this()還是super()
* this() 是調(diào)用本類(lèi)的構(gòu)造方法,super()是調(diào)用父類(lèi)的構(gòu)造方法, 且兩條語(yǔ)句不能同時(shí)存在
* 保證子類(lèi)的所有構(gòu)造方法調(diào)用到父類(lèi)的構(gòu)造方法即可
* B: 小結(jié):
* 無(wú)論如何,子類(lèi)的所有構(gòu)造方法,直接或間接必須調(diào)用到父類(lèi)構(gòu)造方法;
* 子類(lèi)的構(gòu)造方法什么都不寫(xiě),默認(rèn)的構(gòu)造方法第一行super()
17創(chuàng)建子類(lèi)對(duì)象過(guò)程的細(xì)節(jié)
* A 創(chuàng)建子類(lèi)對(duì)象過(guò)程的細(xì)節(jié)
* 如果子類(lèi)的構(gòu)造方法第一行寫(xiě)了this調(diào)用了本類(lèi)其他構(gòu)造方法挠蛉,那么super調(diào)用父類(lèi)的語(yǔ)句還有嗎祭示?
* 這時(shí)是沒(méi)有的,因?yàn)閠his()或者super(),只能定義在構(gòu)造方法的第一行谴古,因?yàn)槌跏蓟瘎?dòng)作要先執(zhí)行质涛。
* 父類(lèi)構(gòu)造方法中是否有隱式的super呢?
* 也是有的掰担。記谆懵健:只要是構(gòu)造方法默認(rèn)第一行都是super();
* 父類(lèi)的父類(lèi)是誰(shuí)呢?super調(diào)用的到底是誰(shuí)的構(gòu)造方法呢带饱?
* Java體系在設(shè)計(jì)毡代,定義了一個(gè)所有對(duì)象的父類(lèi)Object
* 注意:
類(lèi)中的構(gòu)造方法默認(rèn)第一行都有隱式的super()語(yǔ)句,在訪問(wèn)父類(lèi)中的空參數(shù)構(gòu)造方法。所以父類(lèi)的構(gòu)造方法既可以給自己的對(duì)象初始化教寂,也可以給自己的子類(lèi)對(duì)象初始化灯蝴。
如果默認(rèn)的隱式super()語(yǔ)句在父類(lèi)中沒(méi)有對(duì)應(yīng)的構(gòu)造方法,那么必須在構(gòu)造方法中通過(guò)this或者super的形式明確要調(diào)用的構(gòu)造方法孝宗。
==============================第四節(jié)課開(kāi)始====================================
18super的應(yīng)用
* A: 練習(xí):描述學(xué)生和工人這兩個(gè)類(lèi)穷躁,將他們的共性name和age抽取出來(lái)存放在父類(lèi)中,并提供相應(yīng)的get和set方法因妇,同時(shí)需要在創(chuàng)建學(xué)生和工人對(duì)象就必須明確姓名和年齡
* 案例:
//定義Person類(lèi)问潭,將Student和Worker共性抽取出來(lái)
class Person {
private String name;
private int age;
public Person(String name, int age) {
// super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person {
// Student類(lèi)的構(gòu)造方法
Student(String name, int age) {
// 使用super關(guān)鍵字調(diào)用父類(lèi)構(gòu)造方法,進(jìn)行相應(yīng)的初始化動(dòng)作
super(name, age);
}
public void study() {// Studnet中特有的方法
System.out.println(this.getName() + "同學(xué)在學(xué)習(xí)");
}
}
class Worker extends Person {
Worker(String name, int age) {
// 使用super關(guān)鍵字調(diào)用父類(lèi)構(gòu)造方法婚被,進(jìn)行相應(yīng)的初始化動(dòng)作
super(name, age);
}
public void work() {// Worker 中特有的方法
System.out.println(this.getName() + "工人在工作");
}
}
public class Test {
public static void main(String[] args) {
Student stu = new Student("小明",23);
stu.study();
Worker w = new Worker("小李",45);
w.work();
}
}
19完整員工案例分析
* A: 項(xiàng)目介紹
某IT公司有多名員工狡忙,按照員工負(fù)責(zé)的工作不同,進(jìn)行了部門(mén)的劃分(研發(fā)部員工址芯、維護(hù)部員工)灾茁。研發(fā)部根據(jù)所需研發(fā)的內(nèi)容不同,又分為JavaEE工程師谷炸、Android工程師北专;維護(hù)部根據(jù)所需維護(hù)的內(nèi)容不同,又分為網(wǎng)絡(luò)維護(hù)工程師旬陡、硬件維護(hù)工程師拓颓。
公司的每名員工都有他們自己的員工編號(hào)、姓名描孟,并要做它們所負(fù)責(zé)的工作驶睦。
工作內(nèi)容
JavaEE工程師:?jiǎn)T工號(hào)為xxx的 xxx員工,正在研發(fā)淘寶網(wǎng)站
Android工程師:?jiǎn)T工號(hào)為xxx的 xxx員工匿醒,正在研發(fā)淘寶手機(jī)客戶端軟件
網(wǎng)絡(luò)維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工场航,正在檢查網(wǎng)絡(luò)是否暢通
硬件維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工,正在修復(fù)打印機(jī)
請(qǐng)根據(jù)描述廉羔,完成員工體系中所有類(lèi)的定義溉痢,并指定類(lèi)之間的繼承關(guān)系。進(jìn)行XX工程師類(lèi)的對(duì)象創(chuàng)建蜜另,完成工作方法的調(diào)用适室。
* B: 案例分析
根據(jù)上述部門(mén)的描述,得出如下的員工體系圖
根據(jù)員工信息的描述举瑰,確定每個(gè)員工都有員工編號(hào)捣辆、姓名、要進(jìn)行工作此迅。則汽畴,把這些共同的屬性與功能抽取到父類(lèi)中(員工類(lèi))旧巾,關(guān)于工作的內(nèi)容由具體的工程師來(lái)進(jìn)行指定。
工作內(nèi)容
JavaEE工程師:?jiǎn)T工號(hào)為xxx的 xxx員工忍些,正在研發(fā)淘寶網(wǎng)站
Android工程師:?jiǎn)T工號(hào)為xxx的 xxx員工鲁猩,正在研發(fā)淘寶手機(jī)客戶端軟件
網(wǎng)絡(luò)維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工,正在檢查網(wǎng)絡(luò)是否暢通
硬件維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工罢坝,正在修復(fù)打印機(jī)
創(chuàng)建JavaEE工程師對(duì)象廓握,完成工作方法的調(diào)用
20案例代碼實(shí)現(xiàn)
* A:定義員工類(lèi)(抽象類(lèi))
public abstract class Employee {
private String id;// 員工編號(hào)
private String name; // 員工姓名
//空參數(shù)構(gòu)造方法
public Employee() {
super();
}
//有參數(shù)構(gòu)造方法
public Employee(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//工作方法(抽象方法)
public abstract void work();
}
* B : 定義研發(fā)部員工類(lèi)Developer 繼承 員工類(lèi)Employee
public abstract class Developer extends Employee {
//空參數(shù)構(gòu)造方法
public Developer() {
super();
}
//有參數(shù)構(gòu)造方法
public Developer(String id, String name) {
super(id, name);
}
}
* C: 定義維護(hù)部員工類(lèi)Maintainer 繼承 員工類(lèi)Employee
public abstract class Maintainer extends Employee {
//空參數(shù)構(gòu)造方法
public Maintainer() {
super();
}
//有參數(shù)構(gòu)造方法
public Maintainer(String id, String name) {
super(id, name);
}
}
* D: 定義JavaEE工程師 繼承 研發(fā)部員工類(lèi),重寫(xiě)工作方法
public class JavaEE extends Developer {
//空參數(shù)構(gòu)造方法
public JavaEE() {
super();
}
//有參數(shù)構(gòu)造方法
public JavaEE(String id, String name) {
super(id, name);
}
@Override
public void work() {
System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工嘁酿,正在研發(fā)淘寶網(wǎng)站");
}
}
* E: 定義Android工程師 繼承 研發(fā)部員工類(lèi)隙券,重寫(xiě)工作方法
public class Android extends Developer {
//空參數(shù)構(gòu)造方法
public Android() {
super();
}
//有參數(shù)構(gòu)造方法
public Android(String id, String name) {
super(id, name);
}
@Override
public void work() {
System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工,正在研發(fā)淘寶手機(jī)客戶端軟件");
}
}
* F: 定義Network網(wǎng)絡(luò)維護(hù)工程師 繼承 維護(hù)部員工類(lèi)闹司,重寫(xiě)工作方法
public class Network extends Maintainer {
//空參數(shù)構(gòu)造方法
public Network() {
super();
}
//有參數(shù)構(gòu)造方法
public Network(String id, String name) {
super(id, name);
}
@Override
public void work() {
System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工娱仔,正在檢查網(wǎng)絡(luò)是否暢通");
}
}
* G: 定義Hardware硬件維護(hù)工程師 繼承 維護(hù)部員工類(lèi),重寫(xiě)工作方法
public class Hardware extends Maintainer {
//空參數(shù)構(gòu)造方法
public Hardware() {
super();
}
//有參數(shù)構(gòu)造方法
public Hardware(String id, String name) {
super(id, name);
}
@Override
public void work() {
System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工游桩,正在修復(fù)打印機(jī)");
}
}
* H: 在測(cè)試類(lèi)中牲迫,創(chuàng)建JavaEE工程師對(duì)象,完成工作方法的調(diào)用
public class Test {
public static void main(String[] args) {
//創(chuàng)建JavaEE工程師員工對(duì)象借卧,該員工的編號(hào)000015盹憎,員工的姓名 小明
JavaEE ee = new JavaEE("000015", "小明");
//調(diào)用該員工的工作方法
ee.work();
}
}
21總結(jié)
* 把今天的知識(shí)點(diǎn)總結(jié)一遍。
1谓娃、構(gòu)造方法的格式是什么脚乡?有哪些注意事項(xiàng)?
權(quán)限修飾符 類(lèi)名(參數(shù)列表){方法體}
2滨达、構(gòu)造方法可以重載嗎? 里邊可以有return語(yǔ)句嗎俯艰?
可以重載 可以有return但不能有返回值
3捡遍、給成員變量賦值有幾種方式?有什么區(qū)別竹握?
get/set
直接賦值
帶參構(gòu)造器賦值
初始化
static 代碼塊賦值
默認(rèn)構(gòu)造器賦值
4.編寫(xiě)一個(gè)完整的Person類(lèi),使用this關(guān)鍵字給成員變量進(jìn)行賦值.
在測(cè)試類(lèi)中測(cè)試
代碼:
public class HomeWork {
public static void main(String[] args) {
Person p = new Person();
p.run();
System.out.println(p.getAge());
System.out.println(p.getName());
}
}
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void run() {
this.age = 10;
this.name = "邊天旭";
}
}
5画株、根據(jù)需求,完成如下代碼(按照標(biāo)準(zhǔn)格式寫(xiě))啦辐,并在測(cè)試類(lèi)中進(jìn)行測(cè)試谓传。
標(biāo)準(zhǔn)格式包含: 私有屬性 無(wú)參構(gòu)造 有參構(gòu)造 setter 和getter 需求中的方法
需求一:
員工類(lèi)Employee
屬性:姓名name,工號(hào)id,工資salary
行為:顯示所有成員信息的方法show()
代碼:
class Employee {
private String name;
private String id;
private double salary;
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(String name, String id, double salary) {
super();
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void show() {
System.out.println("姓名:" + this.name);
System.out.println("工號(hào):" + this.id);
System.out.println("工資:" + this.salary);
}
}
需求二:
動(dòng)物類(lèi)Animal
屬性:姓名name,年齡age
行為:吃飯eat,睡覺(jué)sleep
代碼:
class Animal {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Animal() {
super();
}
public void eat() {
System.out.println("動(dòng)物吃飯");
}
public void sleep() {
System.out.println("動(dòng)物睡覺(jué)");
}
}
需求三:
人類(lèi)Person
屬性:姓名name,年齡age,性別gender
行為:學(xué)習(xí)study,睡覺(jué)sleep
代碼:
class person {
private String name;
private int age;
private char gender;
public person() {
super();
// TODO Auto-generated constructor stub
}
public person(String name, int age, char gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public void study() {
System.out.println("學(xué)生學(xué)習(xí)");
}
public void sleep() {
System.out.println("學(xué)生睡覺(jué)");
}
}