摘要:繼承的出現(xiàn)讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。繼承的注意事項(xiàng)繼承的注意事項(xiàng)在中,類(lèi)只支持單繼承,不允許多繼承,也就是說(shuō)一個(gè)類(lèi)只能有一個(gè)直接父類(lèi),例如下面這種情況是不合法的。
01繼承的概述
*A:繼承的概念 *a:繼承描述的是事物之間的所屬關(guān)系,通過(guò)繼承可以使多種事物之間形成一種關(guān)系體系 *b:在Java中,類(lèi)的繼承是指在一個(gè)現(xiàn)有類(lèi)的基礎(chǔ)上去構(gòu)建一個(gè)新的類(lèi), 構(gòu)建出來(lái)的新類(lèi)被稱(chēng)作子類(lèi),現(xiàn)有類(lèi)被稱(chēng)作父類(lèi) *B:繼承關(guān)系的子類(lèi)特點(diǎn) *a:子類(lèi)會(huì)自動(dòng)擁有父類(lèi)所有非private修飾的屬性和方法02繼承的定義格式和使用
*A:繼承的格式 class 子類(lèi) extends 父類(lèi) {} *B:雇員(Employee)與研發(fā)部員工(Developer)案例: *cn.itcast.demo01包下: *Employee.java: /* * 定義員工類(lèi)Employee */ class Employee { String name; // 定義name屬性 public void work() {// 定義員工的工作方法 System.out.println("盡心盡力地工作"); } } *Developer.java: /* * 定義研發(fā)部員工類(lèi)Developer 繼承 員工類(lèi)Employee * 繼承了父類(lèi)中所有非private修飾的成員變量 */ class Developer extends Employee { // 定義一個(gè)打印name的方法 public void printName() { System.out.println("name=" + name); } } *測(cè)試員工類(lèi)與研發(fā)部員工類(lèi): /* * 定義測(cè)試類(lèi) */ public class Example01 { public static void main(String[] args) { Developer d = new Developer(); // 創(chuàng)建一個(gè)研發(fā)部員工類(lèi)對(duì)象 d.name = "小明"; // 為該員工類(lèi)的name屬性進(jìn)行賦值 d.printName(); // 調(diào)用該員工的printName()方法 d.work(); // 調(diào)用Developer類(lèi)繼承來(lái)的work()方法 } } *通過(guò)子類(lèi)對(duì)象既可以調(diào)用自身的非private修飾的成員,也可以調(diào)用父類(lèi)的非private修飾的成員03繼承的好處
*A:繼承的好處: *1、繼承的出現(xiàn)提高了代碼的復(fù)用性,提高軟件開(kāi)發(fā)效率。 *2、繼承的出現(xiàn)讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。04繼承的注意事項(xiàng)
*A:繼承的注意事項(xiàng) *a:在Java中,類(lèi)只支持單繼承,不允許多繼承,也就是說(shuō)一個(gè)類(lèi)只能有一個(gè)直接父類(lèi),例如下面這種情況是不合法的。 class A{} class B{} class C extends A,B{} // C類(lèi)不可以同時(shí)繼承A類(lèi)和B類(lèi) 假如支持多繼承例如: class A{ int a=3; public void method(){ } } class B{ int a=5; public void method(){ } } class C extends A,B{ } class Demo{ public static void main(String[] args){ C c=new C(); System.out.println(c.a);//到底是調(diào)用A的還是B的成員變量??無(wú)法確定 c.method();//到底是調(diào)用A的還是B的成員方法??無(wú)法確定 } } ? *b:多個(gè)類(lèi)可以繼承一個(gè)父類(lèi),例如下面這種情況是允許的(就像你爹可以多個(gè)兒子,但是這些兒子都只有一個(gè)爹) class A{} class B extends A{} class C extends A{} // 類(lèi)B和類(lèi)C都可以繼承類(lèi)A ? *c:在Java中,多層繼承是可以的, 即一個(gè)類(lèi)的父類(lèi)可以再去繼承另外的父類(lèi), 例如C類(lèi)繼承自B類(lèi),而B(niǎo)類(lèi)又可以去繼承A類(lèi),這時(shí),C類(lèi)也可稱(chēng)作A類(lèi)的子類(lèi)。下面這種情況是允許的。 class A{} class B extends A{} // 類(lèi)B繼承類(lèi)A,類(lèi)B是類(lèi)A的子類(lèi) class C extends B{} // 類(lèi)C繼承類(lèi)B,類(lèi)C是類(lèi)B的子類(lèi),同時(shí)也是類(lèi)A的子類(lèi)
?
*d:在Java中,子類(lèi)和父類(lèi)是一種相對(duì)概念, 也就是說(shuō)一個(gè)類(lèi)是某個(gè)類(lèi)父類(lèi)的同時(shí),也可以是另一個(gè)類(lèi)的子類(lèi)。 例如上面的這種情況中,B類(lèi)是A類(lèi)的子類(lèi),同時(shí)又是C類(lèi)的父類(lèi)。05繼承的體系.avi 11:00
*A:繼承的體系:
動(dòng)物(吃) | ------------------------- | | 貓科動(dòng)物(吃,胎生) 爬行動(dòng)物(吃,卵生) | | ------------------------------- ----------------- | | | | 貓(吃,抓老鼠,胎生) 虎(吃,領(lǐng)地,胎生) 蛇(吃,冬眠,卵生) 鱷魚(yú)(吃,潛水,卵生) *a:動(dòng)物體系是對(duì)每個(gè)具體事物共性的抽取,子類(lèi)的共性抽取形成父類(lèi) *b:父類(lèi):具有所有子類(lèi)的共性?xún)?nèi)容 子類(lèi):不但有共性還有自身特有的內(nèi)容 *c:整個(gè)繼承體系,越向上越抽象,越向下越具體06繼承后子類(lèi)父類(lèi)成員變量的特點(diǎn)
A:繼承后子類(lèi)父類(lèi)成員變量的特點(diǎn) a:子類(lèi)的對(duì)象調(diào)用成員變量的時(shí)候,子類(lèi)自己有,使用子類(lèi),子類(lèi)自己沒(méi)有調(diào)用的父類(lèi) class Fu{ //Fu中的成員變量。 int num = 5; } class Zi extends Fu{ //Zi中的成員變量 int num2 = 6; //Zi中的成員方法 public void show() { //訪問(wèn)父類(lèi)中的num System.out.println("Fu num="+num); //訪問(wèn)子類(lèi)中的num2 System.out.println("Zi num2="+num2); } } class Demo{ public static void main(String[] args) { Zi z = new Zi(); //創(chuàng)建子類(lèi)對(duì)象 z.show(); //調(diào)用子類(lèi)中的show方法 } } b:當(dāng)子父類(lèi)中出現(xiàn)了同名成員變量 class Fu{ //Fu中的成員變量。 int num = 5; } class Zi extends Fu{ //Zi中的成員變量 int num = 6; void show(){ //子類(lèi)的局部變量 int num=7 //直接訪問(wèn),遵循就近查找原則 System.out.println(num);//7 //子父類(lèi)中出現(xiàn)了同名的成員變量時(shí) //在子類(lèi)中需要訪問(wèn)父類(lèi)中非私有成員變量時(shí),需要使用super關(guān)鍵字 //訪問(wèn)父類(lèi)中的num System.out.println("Fu num="+super.num);//5 //訪問(wèn)子類(lèi)中的num2 System.out.println("Zi num2="+this.num);//6 } } class Demo5 { public static void main(String[] args) { Zi z = new Zi(); //創(chuàng)建子類(lèi)對(duì)象 z.show(); //調(diào)用子類(lèi)中的show方法 } }07繼承后子類(lèi)父類(lèi)成員方法的特性_子類(lèi)重寫(xiě)父類(lèi)方法
A:繼承后子類(lèi)父類(lèi)成員方法的特性 a:子類(lèi)的對(duì)象調(diào)用方法的時(shí)候,子類(lèi)自己有,使用子類(lèi),子類(lèi)自己沒(méi)有調(diào)用的父類(lèi) class Fu{ public void show(){ System.out.println("Fu類(lèi)中的show方法執(zhí)行"); } } class Zi extends Fu{ public void show2(){ System.out.println("Zi類(lèi)中的show2方法執(zhí)行"); } } public class Test{ public static void main(String[] args) { Zi z = new Zi(); z.show(); //子類(lèi)中沒(méi)有show方法,但是可以找到父類(lèi)方法去執(zhí)行 z.show2(); } } b:為什么要有重寫(xiě)? class Fu{ public void method(){ //上千行代碼 //Fu類(lèi)中的方法最先存在,那么如果項(xiàng)目需求變了,該方法 //功能不能夠滿(mǎn)足我們的需求,此時(shí)我們也不會(huì)去改這個(gè)方法 //因?yàn)轫?xiàng)目中可能有大量的功能已經(jīng)使用到該方法,如果隨意修改可能使調(diào)用該方法的功能出現(xiàn)問(wèn)題 //所以使用重寫(xiě)方式基于原有功能提供更強(qiáng)的功能 } } class Zi extends Fu{ } c:子類(lèi)中出現(xiàn)與父類(lèi)一模一樣的方法時(shí),會(huì)出現(xiàn)覆蓋操作,也稱(chēng)為override重寫(xiě)、復(fù)寫(xiě)或者覆蓋 class Fu{ public void show(){ System.out.println("Fu show"); } } class Zi extends Fu{ //子類(lèi)復(fù)寫(xiě)了父類(lèi)的show方法 public void show(){ System.out.println("Zi show"); } } public class Test{ public static void main(String[] args) { Zi z = new Zi(); z.show(); //Zi show 子類(lèi)有直接使用子類(lèi) } }08方法覆蓋的需求
A:方法覆蓋的需求 a:案例:比如手機(jī),當(dāng)描述一個(gè)手機(jī)時(shí),它具有發(fā)短信,打電話(huà),顯示來(lái)電號(hào)碼功能, 后期由于手機(jī)需要在來(lái)電顯示功能中增加顯示姓名和頭像, 這時(shí)可以重新定義一個(gè)類(lèi)描述智能手機(jī),并繼承原有描述手機(jī)的類(lèi)。 并在新定義的類(lèi)中覆蓋來(lái)電顯示功能,在其中增加顯示姓名和頭像功能 b:分析:我們不改裝(破壞)原來(lái)的手機(jī),而是再買(mǎi)一個(gè)新的智能手機(jī),不但有原有的功能,而且還有特有功能 例:廠商發(fā)布新手機(jī)都是基于原有手機(jī)的升級(jí),不會(huì)拿著原有的手機(jī)在賣(mài),新產(chǎn)一款 1:分析類(lèi)的構(gòu)建: 手機(jī)類(lèi) 屬性(成員變量):無(wú) 行為(成員方法): 發(fā)短信 打電話(huà) 來(lái)電顯示:顯示來(lái)電號(hào)碼 智能手機(jī)類(lèi): 屬性(成員變量):無(wú) 行為(成員方法): 發(fā)短信 打電話(huà) 來(lái)電顯示:顯示來(lái)電號(hào)碼,顯示姓名和頭像 手機(jī)類(lèi)和智能手機(jī)類(lèi)有共性?xún)?nèi)容: 發(fā)短信 打電話(huà) 顯示來(lái)電號(hào)碼 2:繼承關(guān)系分析: 對(duì)于發(fā)短信和打電話(huà)功能,讓智能手機(jī)直接沿用(繼承)手機(jī)的就可以 但是在智能手機(jī)中的來(lái)電顯示不但實(shí)現(xiàn)號(hào)碼,還顯示姓名和頭像,同樣的都是來(lái)電顯示功能,智能手機(jī)的來(lái)電顯示比手機(jī)的功能更加強(qiáng)大,我們考慮使用重寫(xiě)09方法覆蓋的手機(jī)案例實(shí)現(xiàn)
//手機(jī)類(lèi) class Phone{ public void sendMessage(){ System.out.println("發(fā)短信"); } public void call(){ System.out.println("打電話(huà)"); } public void showNum(){ System.out.println("來(lái)電顯示號(hào)碼"); } } //智能手機(jī)類(lèi) class NewPhone extends Phone{ //覆蓋父類(lèi)的來(lái)電顯示號(hào)碼功能,并增加自己的顯示姓名和圖片功能 //從現(xiàn)實(shí)生活角度考慮沿用原有的showNum方法名便于用戶(hù)更快熟悉和接受,而不是再起個(gè)新的名字 //用戶(hù)還需要花費(fèi)大量時(shí)間慢慢接受 public void showNum(){ //調(diào)用父類(lèi)已經(jīng)存在的功能使用super //如果不加super這是調(diào)用子類(lèi)自身的showNum(),自己調(diào)用自己,遞歸 //方法不斷入棧導(dǎo)致內(nèi)存溢出 super.showNum(); //增加自己特有顯示姓名和圖片功能 System.out.println("顯示來(lái)電姓名"); System.out.println("顯示頭像"); } } public class Test { public static void main(String[] args) { new NewPhone().showNum();//來(lái)電顯示 顯示來(lái)電姓名 顯示頭像 } }10方法覆蓋的注意事項(xiàng)
A:方法覆蓋的注意事項(xiàng)
a:權(quán)限:子類(lèi)方法覆蓋父類(lèi)方法,必須要保證權(quán)限大于等于父類(lèi)權(quán)限。 四大權(quán)限:public>默認(rèn)=protected>private class Fu{ void show(){ } public void method(){ } } class Zi() extends Fu{ public void show(){//編譯運(yùn)行沒(méi)問(wèn)題 } void method(){//編譯錯(cuò)誤 } } b:方法定義:子類(lèi)方法和要重寫(xiě)的父類(lèi)的方法:方法的方法名和參數(shù)列表都要一樣。 關(guān)于方法的返回值: 如果是基本數(shù)據(jù)類(lèi)型,子類(lèi)的方法和重寫(xiě)的父類(lèi)的方法返回值類(lèi)型必須相同 如果是引用數(shù)據(jù)類(lèi)型,子類(lèi)的方法和重寫(xiě)的父類(lèi)的方法返回值類(lèi)型可以相同或者子類(lèi)方法的返回值類(lèi)型是父類(lèi)方法返回值類(lèi)型的子類(lèi) class Fu{ int show(){ } public Fu method(){ } public Fu method2(){ } } class Zi() extends Fu{ public int show(){//返回值為基本類(lèi)型的重寫(xiě) } public Fu method(){//子類(lèi)的方法和重寫(xiě)的父類(lèi)的方法返回值類(lèi)型可以相同 } public Zi method2(){//子類(lèi)方法的返回值類(lèi)型是父類(lèi)方法返回值類(lèi)型的子類(lèi) } } c:重載與重寫(xiě)對(duì)比: 重載: 權(quán)限修飾符(public private 默認(rèn)):無(wú)關(guān) 方法名:重載的兩個(gè)方法的方法名必須相同 形參列表: 形參類(lèi)型的順序不同 形參的個(gè)數(shù)不同 形參的類(lèi)型不同 三者至少滿(mǎn)足一個(gè) 返回值類(lèi)型: 重載與返回值類(lèi)型無(wú)關(guān) 重寫(xiě): 權(quán)限修飾符(public private 默認(rèn)): 子類(lèi)方法的權(quán)限>=父類(lèi)的方法的權(quán)限 方法名: 子類(lèi)方法和父類(lèi)方法必須相同 形參列表: 子類(lèi)方法和父類(lèi)方法的形參列表必須相同 返回值類(lèi)型: 基本類(lèi)數(shù)據(jù)類(lèi)型: 必須相同 引用數(shù)據(jù)類(lèi)型: 子類(lèi)方法的返回值類(lèi)型和父類(lèi)方法的返回值類(lèi)型相同 或者 子類(lèi)方法的返回值類(lèi)型是父類(lèi)方法的返回值類(lèi)型的 子類(lèi)11抽象類(lèi)的產(chǎn)生
A:抽象類(lèi)的產(chǎn)生 a:分析事物時(shí),發(fā)現(xiàn)了共性?xún)?nèi)容,就出現(xiàn)向上抽取。會(huì)有這樣一種特殊情況,就是方法功能聲明相同,但方法功能主體不同。那么這時(shí)也可以抽取,但只抽取方法聲明,不抽取方法主體。那么此方法就是一個(gè)抽象方法。12抽象類(lèi)的定義格式
A:抽象方法定義的格式: a:public abstract 返回值類(lèi)型 方法名(參數(shù)); 抽象類(lèi)定義的格式: abstract class 類(lèi)名 { } b:抽象類(lèi)示例代碼: /* * 定義類(lèi)開(kāi)發(fā)工程師類(lèi) * EE開(kāi)發(fā)工程師 : 工作 * Android開(kāi)發(fā)工程師 : 工作 * * 根據(jù)共性進(jìn)行抽取,然后形成一個(gè)父類(lèi)Develop * 定義方法,工作: 怎么工作,具體干什么呀 * * 抽象類(lèi),不能實(shí)例化對(duì)象, 不能new的 * 不能創(chuàng)建對(duì)象的原因: 如果真的讓你new了, 對(duì)象.調(diào)用抽象方法,抽象方法沒(méi)有主體,根本就不能運(yùn)行 * 抽象類(lèi)使用: 定義類(lèi)繼承抽象類(lèi),將抽象方法進(jìn)行重寫(xiě),創(chuàng)建子類(lèi)的對(duì)象 */ public abstract class Develop { //定義方法工作方法,但是怎么工作,說(shuō)不清楚了,講不明白 //就不說(shuō), 方法沒(méi)有主體的方法,必須使用關(guān)鍵字abstract修飾 //抽象的方法,必須存在于抽象的類(lèi)中,類(lèi)也必須用abstract修飾 public abstract void work(); }13抽象類(lèi)的使用方式
A:抽象類(lèi)的使用方式 /* * 定義類(lèi),JavaEE的開(kāi)發(fā)人員 * 繼承抽象類(lèi)Develop,重寫(xiě)抽象的方法 */ public class JavaEE extends Develop{ //重寫(xiě)父類(lèi)的抽象方法 //去掉abstract修飾符,加上方法主體 public void work(){ System.out.println("JavaEE工程師在開(kāi)發(fā)B/S 軟件"); } } /* * 定義Android類(lèi),繼承開(kāi)發(fā)人員類(lèi) * 重寫(xiě)抽象方法 */ public class Android extends Develop{ public void work(){ System.out.println("Android工程師開(kāi)發(fā)手機(jī)軟件"); } } /* * 測(cè)試抽象類(lèi) * 創(chuàng)建他的子類(lèi)的對(duì)象,使用子類(lèi)的對(duì)象調(diào)用方法 */ public class Test { public static void main(String[] args) { JavaEE ee = new JavaEE(); ee.work();//"JavaEE工程師在開(kāi)發(fā)B/S 軟件" Android and = new Android(); and.work();//"Android工程師開(kāi)發(fā)手機(jī)軟件" } }14抽象類(lèi)特點(diǎn)
A:抽象類(lèi)的特點(diǎn)
a:抽象類(lèi)和抽象方法都需要被abstract修飾。抽象方法一定要定義在抽象類(lèi)中。 b:抽象類(lèi)不可以直接創(chuàng)建對(duì)象,原因:調(diào)用抽象方法沒(méi)有意義。 c:只有覆蓋了抽象類(lèi)中所有的抽象方法后,其子類(lèi)才可以創(chuàng)建對(duì)象。否則該子類(lèi)還是一個(gè)抽象類(lèi)。 之所以繼承抽象類(lèi),更多的是在思想,是面對(duì)共性類(lèi)型操作會(huì)更簡(jiǎn)單。 abstract class A{ public abstract void func(); public abstract void func2(); } class A2 extends A{//A2把A中的兩個(gè)抽象方法都重寫(xiě)掉了 //A2類(lèi)不再是抽象類(lèi) public void func(){} public void func2(){} } abstract class A3 extends A{//含有抽象方法的類(lèi)一定是抽象類(lèi) public void func(){ } //public abstract void func2();//func2相當(dāng)于被繼承下來(lái) }15抽象類(lèi)的設(shè)計(jì)思想 4:40
A:抽象類(lèi)的設(shè)計(jì)思想 a:抽象類(lèi)的作用:繼承的體系抽象類(lèi),強(qiáng)制子類(lèi)重寫(xiě)抽象的方法 抽象員工: 規(guī)定一個(gè)方法,work工作 EE員工,Android員工 Develop類(lèi) 抽象類(lèi) abstract work(); | ------------- | | EE Android //是我開(kāi)發(fā)的一員必須工作 work(){} work(){}16抽象類(lèi)的細(xì)節(jié)
A:抽象類(lèi)的細(xì)節(jié)
a:抽象類(lèi)一定是個(gè)父類(lèi)? 是的,因?yàn)椴粩喑槿《鴣?lái)的。 b:抽象類(lèi)中是否可以不定義抽象方法? 是可以的,那這個(gè)抽象類(lèi)的存在到底有什么意義呢?不讓該類(lèi)創(chuàng)建對(duì)象,方法可以直接讓子類(lèi)去使用 (適配器設(shè)計(jì)模式) /* * 抽象類(lèi),可以沒(méi)有抽象方法,可以定義帶有方法體的方法 * 讓子類(lèi)繼承后,可以直接使用 */ public abstract class Animal { public void sleep(){ System.out.println("動(dòng)物睡覺(jué)"); } } public class Cat extends Animal{ } public class Test { public static void main(String[] args) { //Cat c = new Cat(); new Cat().sleep();//不讓該類(lèi)創(chuàng)建對(duì)象,方法可以直接讓子類(lèi)去使用 } } c:抽象關(guān)鍵字abstract不可以和哪些關(guān)鍵字共存?
? 1:private:私有的方法子類(lèi)是無(wú)法繼承到的,也不存在覆蓋,
而abstract和private一起使用修飾方法,abstract既要子類(lèi)去實(shí)現(xiàn)這個(gè)方法, 而private修飾子類(lèi)根本無(wú)法得到父類(lèi)這個(gè)方法?;ハ嗝?。 /* * 抽象類(lèi),可以沒(méi)有抽象方法,可以定義帶有方法體的方法 * 讓子類(lèi)繼承后,可以直接使用 */ public abstract class Animal { // private abstract void show(); //抽象方法,需要子類(lèi)重寫(xiě), 如果父類(lèi)方法是私有的,子類(lèi)繼承不了,也就沒(méi)有了重寫(xiě) }
?
2:final,暫時(shí)不關(guān)注,后面學(xué)
? 3:static,暫時(shí)不關(guān)注,后面學(xué)
17員工案例分析A:員工案例分析:
a:需求描述:
某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ī)客戶(hù)端軟件 ? 網(wǎng)絡(luò)維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工,正在檢查網(wǎng)絡(luò)是否暢通 ? 硬件維護(hù)工程師:?jiǎn)T工號(hào)為xxx的 xxx員工,正在修復(fù)打印機(jī)
b:繼承體系:
員工 | -------------------------------------------- | | 研發(fā)部員工 維護(hù)部員工 | |
------------- -----------
| | | |
JavaEE工程師 Android工程師 網(wǎng)絡(luò)維護(hù)工程師 硬件維護(hù)工程師
c:詳細(xì)描述:
? 根據(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ī)客戶(hù)端軟件 ? 網(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)用
18員工案例Employee類(lèi)的編寫(xiě)A:員工案例Employee類(lèi)的編寫(xiě):按照分析的繼承體系來(lái)逐個(gè)實(shí)現(xiàn)
/* * 定義員工類(lèi) * 內(nèi)容,都是所有子類(lèi)的共性抽取 * 屬性: 姓名,工號(hào) * 方法: 工作 */ public abstract class Employee { private String id;// 員工編號(hào) private String 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(); }19員工案例的子類(lèi)的編寫(xiě)
B:員工案例的子類(lèi)的編寫(xiě):
/* * 定義研發(fā)員工類(lèi) * 屬于員工中的一種, 繼承員工類(lèi) * 抽象類(lèi)Develop 給自己的員工定義自己有的屬性 */ public abstract class Develop extends Employee{ } /* * 描述JavaEE開(kāi)發(fā)工程師類(lèi) * 工號(hào),姓名 工作方法 * 其他的員工,也具備這些共性,抽取到父類(lèi)中,自己就不需要定義了 * 是研發(fā)部員工的一種,繼承研發(fā)部類(lèi) */ public class JavaEE extends Develop{ //重寫(xiě)他父類(lèi)的父類(lèi)的抽象方法 public void work(){ //調(diào)用父類(lèi)的get方法,獲取name,id值 System.out.println("JavaEE的工程師開(kāi)發(fā)淘寶"+ super.getName()+".."+super.getId()); } } /* *定義Android工程師 繼承 研發(fā)部員工類(lèi),重寫(xiě)工作方法 */ public class Android extends Developer { @Override public void work() { System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工,正在研發(fā)淘寶手機(jī)客戶(hù)端軟件"); } }
/* * 定義維護(hù)員工類(lèi),屬于員工中的一種 * 繼承員工類(lèi) * 抽象類(lèi)Maintainer 給自己的員工定義自己有的屬性 */ public abstract class Maintainer extends Employee{ } /* * 描述的是網(wǎng)絡(luò)維護(hù)工程師 * 屬于維護(hù)部的員工,繼承維護(hù)部類(lèi) */ public class Network extends Maintainer{ public void work(){ System.out.println("網(wǎng)絡(luò)工程師在檢查網(wǎng)絡(luò)是否暢通"+super.getName()+"..."+super.getId()); } }
?
/* *定義Hardware硬件維護(hù)工程師 繼承 維護(hù)部員工類(lèi),重寫(xiě)工作方法 */ public class Hardware extends Maintainer { @Override public void work() { System.out.println("員工號(hào)為 " + getId() + " 的 " + getName() + " 員工,正在修復(fù)打印機(jī)"); } }20總結(jié)
把今天的知識(shí)點(diǎn)總結(jié)一遍。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67148.html
摘要:構(gòu)造方法名稱(chēng)必須和類(lèi)型保持一致。構(gòu)造方法沒(méi)有具體的返回值。構(gòu)造方法之間的調(diào)用,可以通過(guò)關(guān)鍵字來(lái)完成。由于構(gòu)造方法中使用了構(gòu)造方法就會(huì)壓棧,并將張三傳遞給。程序繼續(xù)執(zhí)行構(gòu)造方法中的這時(shí)會(huì)將賦值給成員屬性。賦值結(jié)束構(gòu)造方法彈棧。 01構(gòu)造方法引入 * A:構(gòu)造方法的引入 在開(kāi)發(fā)中經(jīng)常需要在創(chuàng)建對(duì)象的同時(shí)明確對(duì)象的屬性值,比如員工入職公司就要明確他的姓名、年齡等屬性信息。 ...
摘要:當(dāng)遇到方法參數(shù)為抽象類(lèi)類(lèi)型時(shí),要傳入一個(gè)實(shí)現(xiàn)抽象類(lèi)所有抽象方法的子類(lèi)對(duì)象。根據(jù)向酒店中,增加多名員工其中包含名經(jīng)理,名廚師名服務(wù)員。 01eclipse快捷鍵 * A: ? Ctrl+T:查看所選中類(lèi)的繼承樹(shù) 例如,在下面代碼中,選中Teacher類(lèi)名,然后按Ctrl+T,就會(huì)顯示出Teacher類(lèi)的繼承關(guān)系 * B:? 查看所選中方法的源代碼 Ctrl+...
摘要:多態(tài)的前提是必須有子父類(lèi)關(guān)系或者類(lèi)實(shí)現(xiàn)接口關(guān)系,否則無(wú)法完成多態(tài)。具體格式如下父類(lèi)引用指向子類(lèi)對(duì)象就是多態(tài)的定義格式。多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種向上轉(zhuǎn)型當(dāng)有子類(lèi)對(duì)象賦值給一個(gè)父類(lèi)引用時(shí),便是向上轉(zhuǎn)型,多態(tài)本身就是向上轉(zhuǎn)型的過(guò)程。 第3天 面向?qū)ο?今日內(nèi)容介紹? 接口? 多態(tài)? 筆記本案例今日學(xué)習(xí)目標(biāo)? 寫(xiě)出定義接口的格式? 寫(xiě)出實(shí)現(xiàn)接口的格式?...
摘要:案例演示抽象類(lèi)的成員特點(diǎn)抽象類(lèi)的成員方法特性抽象方法強(qiáng)制要求子類(lèi)做的事情。抽象類(lèi)中定義的是該繼承體系的共性功能。 1.多態(tài)的概述及其成員訪問(wèn)特點(diǎn)代碼體現(xiàn) A:多態(tài)(polymorphic)概述 事物存在的多種形態(tài) B:多態(tài)前提- 1.要有繼承關(guān)系 2.要有方法重寫(xiě) 3.要有父類(lèi)引用指向子類(lèi)對(duì)象。 C:多態(tài)中的成員訪問(wèn)特點(diǎn)之 成員變量:編譯和運(yùn)行都看父類(lèi)。 成員方法:編...
簡(jiǎn)介 1.學(xué)習(xí)本篇博文,我們知道在什么場(chǎng)景下使用策略模式。2.策略模式的優(yōu)缺點(diǎn)。3.策略模式的思想。 場(chǎng)景 某公司需要每個(gè)周五每名員工都要提交周報(bào),在該公司可以提交周報(bào)的行為或者算法有:郵箱提交、SVN、Git后兩種一般是開(kāi)發(fā)部門(mén)使用的(剛開(kāi)始還沒(méi)有Git提交方式)。 那么在該場(chǎng)景中我們是如何設(shè)計(jì)業(yè)務(wù)邏輯呢? 你可能這么想,我用繼承的方式多好,在一個(gè)超類(lèi)中都定義有郵箱提交,SVN提交,然后具體角色...
閱讀 2515·2021-11-15 11:36
閱讀 1260·2019-08-30 15:56
閱讀 2312·2019-08-30 15:53
閱讀 1103·2019-08-30 15:44
閱讀 713·2019-08-30 14:13
閱讀 1052·2019-08-30 10:58
閱讀 542·2019-08-29 15:35
閱讀 1367·2019-08-29 13:58