[Java][華為云Java編程創(chuàng)造營][學(xué)習(xí)筆記][第二階段][03_Java面向?qū)ο笾鄳B(tài)]

      網(wǎng)友投稿 600 2025-04-01

      1,方法重寫

      1.1,子類和父類同名方法

      1.1.1,子類和父類同名方法

      子類和父類同名方法,方法重寫

      前提:需要有繼承關(guān)系

      方法重寫表現(xiàn):(方法名必須相同;參數(shù)列表必須相同;返回值類型必須相同;修飾符:范圍可以擴大或相同,但是不能縮小public>protected>default)

      1.1.2,方法重寫

      class Animal { public void eat() { System.out.println("動物在吃東西"); } } class Cat extends Animal { @Override public void eat() { System.out.println("貓吃魚"); } } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉"); } } public class Test { public static void main(String[] args) { /* * 輸出結(jié)果 * 動物在吃東西 貓吃魚 狗吃肉 * */ Animal animal = new Animal(); animal.eat(); //輸出動物類eat()方法 Animal cat = new Cat(); cat.eat(); //輸出貓類eat()方法 Animal dog = new Dog(); dog.eat(); //輸出狗類eat()方法 } }

      不能重寫父類的private方法,如果定義的話只是定義了一個新方法,不是方法重寫

      class Animal { private void talk() { System.out.println("動物在說"); } } class Cat extends Animal { void talk() { System.out.println("貓在喵喵叫"); } } public class Test { public static void main(String[] args) { Animal animal = new Animal(); //方法不可見 //animal.talk(); //報錯:'talk()' has private access in 'com.huawei.demo2.Animal' Cat cat = new Cat(); //父類指向子類,向上轉(zhuǎn)型 Animal animal1 = cat; //方法不可見,說明talk()方法沒有被子類重寫 //animal1.talk(); //報錯:'talk()' has private access in 'com.huawei.demo2.Animal' cat.talk(); //貓在喵喵叫` } }

      1.1.3,運行時多態(tài)

      如果被調(diào)用的方法在編譯期無法被確定下來,

      只能夠在程序運行期間根據(jù)實際的類型綁定相關(guān)的方法,這種綁定方法也被稱為后期綁定。

      方法重寫是根據(jù)實際的類型決定調(diào)用哪個重寫的方法,發(fā)生在運行期間,也叫做運行時多態(tài)。

      class Animal { public void eat() { System.out.println("動物吃東西"); } } class Cat extends Animal { @Override public void eat() { System.out.println("貓吃魚"); } } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉"); } } public class Test { public static void main(String[] args) { Animal animal = new Cat(); animal.eat(); //貓吃魚 } }

      1.2,static修飾同名方法

      子類和父類static修飾的同名方法

      static修飾的方法是靜態(tài)方法,也叫做類方法

      使用private或static或final修飾的變量或方法,是早期綁定

      class Animal { static void eat() { System.out.println("動物吃東西"); } } class Cat extends Animal { static void eat() { System.out.println("貓吃魚"); } } public class Test { public static void main(String[] args) { Animal animal = new Cat(); //animal.eat(); //報錯:Static member 'com.huawei.demo4.Animal.eat()' accessed via instance reference } }

      1.3,解耦合

      1.3.1,動態(tài)綁定和解耦合簡介

      在運動時根據(jù)具體對象的類型進行綁定,也就是后期綁定。

      解耦合,字面意思就是解除耦合關(guān)系。

      盡可能減少代碼耦合,如果發(fā)現(xiàn)代碼耦合,就要采取解耦技術(shù)。

      數(shù)據(jù)模型,業(yè)務(wù)邏輯和視圖顯示三層之間彼此降低耦合。

      1.4,同名變量

      class Father { int a = 1; static int b = 1; Father() { a = 10; b = 10; } } public class Son extends Father { int a = 2; static int b = 2; Son() { a = 20; b = 20; } public static void main(String[] args) { Son son = new Son(); Father father = son; System.out.println("father.a=" + father.a + ",father.b=" + father.b); //father.a=10,father.b=10 System.out.println("son.a" + son.a + ",son.b=" + son.b); //son.a20,son.b=20 } }

      1.5,方法重載和方法重寫區(qū)別

      多態(tài)的具體表現(xiàn)

      2,抽象類

      2.1,抽象類的定義

      動物Animal都有自己的行為,小鳥和老虎繼承了動物的行為,但小鳥和老虎的行動方式不一樣。在動物類中能給出行動的具體實現(xiàn)嗎?

      使用abstract關(guān)鍵字修飾的方法叫做抽象方法,抽象方法沒有方法體。當一個類中包含了抽象方法,那么該類也必須使用abstract關(guān)鍵字來修飾,這種使用abstract關(guān)鍵字修飾的類就是抽象類。

      [Java][華為云Java編程創(chuàng)造營][學(xué)習(xí)筆記][第二階段][03_Java面向?qū)ο笾鄳B(tài)]

      抽象類及抽象方法定義的語法格式

      /** * [修飾符] abstract class 類名 * { * //定義抽象方法 * [修飾符] abstract 方法返回值類型 方法名([參數(shù)列表]); * //其他方法或?qū)傩?* } * */

      2.2,抽象類的作用

      抽象類的作用類似于"模板",其目的是方便開發(fā)人員根據(jù)抽象類的格式來修改和創(chuàng)建新類。

      抽象類主要用于繼承,有利于程序的擴展。

      abstract class Book { abstract String getAuthor(); } class ComputerBook extends Book { String getAuthor() { return "Java之父詹姆斯高斯林 James Gosling"; } } class EnglishBook extends Book { String getAuthor() { return "Tom"; } }

      1,抽象類不能創(chuàng)建對象,如果創(chuàng)建,編譯無法通過而報錯,只能創(chuàng)建其非抽象子類的對象。

      2,抽象類中,可以有構(gòu)造器,是供子類創(chuàng)建對象時,初始化父類成員使用的。

      3,抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

      4,抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,不然編譯無法通過而報錯。

      5,抽象類中的抽象方法不能用private,final,static修飾。

      6,抽象類存在的意義是為了被子類繼承,抽象類體現(xiàn)的是模板思想。

      2.3,抽象類設(shè)計和場景

      我們現(xiàn)在使用抽象類設(shè)計一個模板模式的應(yīng)用

      場景:

      新司機:開門,點火,雙手緊握方向盤,剎車,熄火

      老司機:開門,點火,右手握方向盤左手抽煙,剎車,熄火

      abstract class Driver { void go() { System.out.println("開門"); System.out.println("點火"); //將開車姿勢設(shè)置為抽象類以提供模板 posture(); System.out.println("剎車"); System.out.println("熄火"); } abstract void posture(); } class NewDriver extends Driver { @Override void posture() { System.out.println("新司機雙手緊握方向盤"); } } class OldDriver extends Driver { @Override void posture() { System.out.println("老司機右手握方向盤左手點煙"); } } public class DriverTest { public static void main(String[] args) { NewDriver newDriver = new NewDriver(); newDriver.go(); /*開門 點火 新司機雙手緊握方向盤 剎車 熄火 */ OldDriver oldDriver = new OldDriver(); oldDriver.go(); /*開門 點火 老司機右手握方向盤左手點煙 剎車 熄火 */ } }

      3,接口

      3.1,接口的定義

      接口就是某個事物對外提供的一些功能的聲明。

      可以利用接口實現(xiàn)多態(tài),同時接口也彌補了Java單一繼承的弱點

      使用interface關(guān)鍵字定義接口

      3.2,接口的特點和作用

      接口允許多繼承。

      接口沒有構(gòu)造方法。

      接口中的屬性默認是用public static final修飾的。

      接口中的方法默認使用public abstract修飾的。

      接口繼承接口用extends,不能implement。

      public interface MyInterface { //設(shè)計接口和設(shè)計類有什么區(qū)別 //屬性 public static final String STR = "my interface"; //接口中的屬性默認就是final //接口中的屬性一般設(shè)置為 public static final 修飾的常量 //方法 //接口中不能有構(gòu)造方法 //MyInterface(){} //報錯:Interface abstract methods cannot have body public void test(); public void test2(); //在JDK1.8之前接口中的方法都是抽象方法 }

      在接口內(nèi)部可以定義多個常量和抽象方法,定義常量時必須進行初始化賦值,定義默認方法和靜態(tài)方法時,可以有方法體。

      在接口中定義常量時,可以省略"public static final"修飾符,接口會默認為常量添加"public static final"修飾符。與此類似,在接口中定義抽象方法時,也可以省略"public abstract"

      修飾符,定義default默認方法和static靜態(tài)方法時,可以省略"public"修飾符,這些修飾符系統(tǒng)都會默認進行添加。

      /** * [修飾符] interface 接口名 [extends 父接口1,父接口2,...] * { * [public] [static] [final] 常量類型 常量名 = 常量值; * [public] [abstract] 方法返回值類型 方法名([參數(shù)列表]); * [public] default 方法返回值類型 方法名([參數(shù)列表]) * { * //默認方法的方法體 * } * [public] static 方法返回值類型 方法名([參數(shù)列表]) * { * //類方法的方法體 * } * } * */

      public interface MyInterface { //JDK1.8之后的新特征 //接口中可以定義默認方法(可以有多個),有方法體 default String showStr() { System.out.println("MyInterface 中的默認方法:showStr"); return STR; } default String showStr2() { System.out.println("MyInterface 中的默認方法:showStr2"); return STR; } //接口中可以定義靜態(tài)方法,有方法體 static void showInfo() { System.out.println("MyInterface 中的靜態(tài)方法:showInfo"); } static void showInfo2() { System.out.println("MyInterface 中的靜態(tài)方法:showInfo2"); } }

      接口代表一種能力,例如:“做這項工作需要一個程序員”。(程序員是一種能力,不關(guān)心具體是誰)

      接口是一種能力(體現(xiàn)在接口的方法上)。

      面向接口編程(關(guān)心實現(xiàn)類有何能力,而不關(guān)心實現(xiàn)細節(jié);面向接口的約定而不考慮接口的具體實現(xiàn))

      1,從JDK8開始,接口中的方法除了包含抽象方法外,還包含默認方法和靜態(tài)方法,默認方法和靜態(tài)方法都可以有方法體,并且靜態(tài)方法可以通過"接口.方法名"來調(diào)用。

      2,當一個類實現(xiàn)接口時,如果這個類是抽象類,只需實現(xiàn)接口中的部分抽象方法即可,否則需要實現(xiàn)接口中的所有抽象方法。

      3,一個類可以通過implements關(guān)鍵字同時實現(xiàn)多個接口,被實現(xiàn)的多個接口之間要用英文逗號隔開。

      4,接口之間可以通過extends關(guān)鍵字實現(xiàn)繼承,并且一個接口可以同時繼承多個接口,接口之間用英文逗號隔開。

      5,一個類在繼承一個類的同時還可以實現(xiàn)接口,此時,extends關(guān)鍵字必須位于implements關(guān)鍵字之前。

      3.3,接口的設(shè)計和使用場景

      面向接口編程例子

      需求:開發(fā)打印機

      墨盒:黑白,彩色

      紙張類型:A4,B5

      墨盒和紙張都不是打印機廠商提供的

      打印機廠商要兼容市場上的墨盒和紙張

      輸出結(jié)果:使用黑白墨盒在A4紙打印;使用彩色墨盒在B5紙打??;使用彩色墨盒在A4紙打印

      //墨盒 public interface ColorBox { void useColor(); } public class BlackWhileBox implements ColorBox { @Override public void useColor() { System.out.print("使用黑白墨盒"); } } public class ColorfulBox implements ColorBox { @Override public void useColor() { System.out.print("使用彩色墨盒"); } } //紙張 public interface PaperSize { void usePaperSize(); } public class PaperA4 implements PaperSize { @Override public void usePaperSize() { System.out.print("在A4紙上打印"); } } public class PaperB5 implements PaperSize { @Override public void usePaperSize() { System.out.print("在B5紙上打印"); } } //主方法 public class TestPrinter { public static void main(String[] args) { BlackWhileBox blackWhileBox = new BlackWhileBox(); ColorfulBox colorfulBox = new ColorfulBox(); PaperA4 paperA4 = new PaperA4(); PaperB5 paperB5 = new PaperB5(); blackWhileBox.useColor(); paperA4.usePaperSize(); System.out.println(); // 使用黑白墨盒在A4紙上打印 colorfulBox.useColor(); paperB5.usePaperSize(); System.out.println(); // 使用彩色墨盒在B5紙上打印 colorfulBox.useColor(); paperA4.usePaperSize(); System.out.println(); // 使用彩色墨盒在A4紙上打印 } }

      4,接口和抽象類的區(qū)別

      4.1,抽象類is-a

      抽象類的特點

      1,抽象類不能創(chuàng)建對象,如果創(chuàng)建,編譯無法通過而報錯,只能創(chuàng)建其非抽象子類的對象。

      2,抽象類中,可以有構(gòu)造器,是供子類創(chuàng)建對象時,初始化父類成員使用的。

      3,抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

      4,抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無法通過而報錯。

      5,抽象類中的抽象方法不能用private,final,static修飾。

      6,抽象類存在的意義是為了被子類繼承,抽象類體現(xiàn)的是模板思想。

      繼承與真實世界類似,只要說"貓是哺乳動物",貓的很多屬性和行為就不言自明了。

      符合 is-a 關(guān)系的設(shè)計使用繼承

      繼承是代碼重用的一種方式,將子類共有的屬性和行為放到父類中,子類與父類是is-a關(guān)系。

      4.2,接口has-a

      下面以一個防盜門的例子來說明 is-a 與 has-a。

      //Door public abstract class Door { public abstract void open(); //開門 public abstract void close(); //關(guān)門 } //Lock public interface Lock { void lockUp(); //鎖 void openLock(); //開鎖 } //TheftProofDoor public class TheftProofDoor extends Door implements Lock { //is-a:防盜門是門 //has-a:防盜門有開鎖和關(guān)鎖的功能 @Override public void open() { System.out.println("門打開了"); } @Override public void close() { System.out.println("門關(guān)上了"); } @Override public void lockUp() { System.out.println("把門鎖上了"); } @Override public void openLock() { System.out.println("把門鎖打開了"); } } //DoorTest /* * 實現(xiàn)防盜門功能(防盜門是一個門) * 防盜門有一個鎖(上鎖,開鎖) * is-a的關(guān)系 * has-a的關(guān)系 * * */ public class DoorTest { public static void main(String[] args) { //創(chuàng)建具體防盜門對象 TheftProofDoor theftProofDoor = new TheftProofDoor(); theftProofDoor.close();//關(guān)門 theftProofDoor.lockUp();//鎖門 theftProofDoor.openLock();//開鎖 theftProofDoor.open();//開門 /* * 輸出結(jié)果: * 門關(guān)上了 * 把門鎖上了 * 把門鎖打開了 * 門打開了 * */ } }

      4.3,猜數(shù)字游戲?qū)崙?zhàn)

      import java.util.Scanner; /* * 需求:編寫程序隨機生成一個1-10之間的隨機數(shù)。程序提示用戶輸入一個數(shù)字,不停猜測, * 直到猜對為止,然后輸出猜測的數(shù)字,和猜測的次數(shù)。 * 并且如果沒有猜中要提示用戶輸入的值大了還是小了。 * */ public class GuessNumberDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請輸入一個正數(shù),范圍1-10之間:"); int guessNum = (int) (Math.random() * 10 + 1);//[0.0,1.0) int i = 0; while (true) //不知道要猜多少次,要死循環(huán),滿足條件結(jié)束循環(huán) { System.out.print("猜第" + ++i + "次:"); int result = scanner.nextInt(); //接收用戶每次從鍵盤輸入的正數(shù) if (result < guessNum) { System.out.println("小了"); } else if (result > guessNum) { System.out.println("大了"); } else { System.out.println("猜對了"); break; } } } }

      Java

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:為什么播放幻燈片沒有音樂(幻燈片加上音樂就不自動播放了)
      下一篇:excel行列轉(zhuǎn)換
      相關(guān)文章
      亚洲日韩一区二区一无码| 亚洲一区中文字幕在线观看| 亚洲高清有码中文字| 亚洲黄网在线观看| 亚洲国产精品无码久久SM| 亚洲中文字幕无码一久久区| 中文字幕亚洲第一| 亚洲人AV永久一区二区三区久久| 亚洲成AⅤ人影院在线观看| 欧美色欧美亚洲另类二区| 欧美色欧美亚洲另类二区| 精品国产亚洲一区二区三区在线观看| 亚洲精华液一二三产区| 激情无码亚洲一区二区三区| 国产亚洲精品精品精品| 狼人大香伊蕉国产WWW亚洲| 亚洲欧美日韩中文字幕在线一区| 亚洲码和欧洲码一码二码三码| 亚洲精品乱码久久久久久蜜桃图片| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲av无码专区在线电影| 精品久久久久亚洲| 亚洲欧洲自拍拍偷精品 美利坚 | 国产精品亚洲精品日韩已方| 亚洲男人天堂2020| 伊人久久综在合线亚洲91 | 天天爽亚洲中文字幕| 亚洲国产精品无码观看久久| 亚洲AV成人精品一区二区三区| 亚洲国产精品自产在线播放| 亚洲熟妇无码另类久久久| 久久久久久a亚洲欧洲AV| 亚洲视频免费播放| 国产精品亚洲专区在线观看| 亚洲av色香蕉一区二区三区蜜桃| 亚洲av区一区二区三| 亚洲人成精品久久久久| 666精品国产精品亚洲| 亚洲国产91在线| 亚洲av日韩av欧v在线天堂| 亚洲熟妇av一区二区三区|