<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
繼承機制:是物件導向程式設計是程式碼可以複用的最重要手段,允許程式設計師在保持原有類特性的基礎上進行擴充套件,增加新的功能,產生的新類,成為派生類/子類。繼承主要解決的問題是:共性的抽取,實現程式碼的複用。
表示類與類的繼承關係,需要藉助關鍵字extends,語法如下:
修飾符 class 子類/派生類 extends 父類別/基礎類別/超類{
//…………
}
public class Base { int a; int b; int c; } public class Derived extends Base{ int a; // 與父類別中成員a同名,且型別相同 char b; // 與父類別中成員b同名,但型別不同 public void method(){ a = 100; // 存取父類別繼承的a,還是子類自己新增的a? b = 101; // 存取父類別繼承的b,還是子類自己新增的b? c = 102; // 子類沒有c,存取的肯定是從父類別繼承下來的c } }
如果父類別和子類同名方法的參數列不同(過載),根據呼叫方法時傳遞的引數選擇合適的方法存取。
如果父類別和子類的同名方法原型一致,則存取子類的
super關鍵字的主要作用是:在子類方法中存取父類別的同名成員。(只能在非靜態方法中使用)
public class Base { int a; int b; public void methodA(){ System.out.println("Base中的methodA()"); } public void methodB(){ System.out.println("Base中的methodB()"); } public class Derived extends Base{ int a; char b; // 與父類別中methodA()構成過載 public void methodA(int a) { System.out.println("Derived中的method()方法"); } // 與父類別中methodB()構成重寫 public void methodB(){ System.out.println("Derived中的methodB()方法"); } public void methodC(){ a = 100; // 等價於: this.a = 100; b = 101; // 等價於: this.b = 101; // 存取父類別的成員變數時,需要藉助super關鍵字 // super是獲取到子類物件中從基礎類別繼承下來的部分 super.a = 200; super.b = 201; methodA(); // 沒有傳參,存取父類別中的methodA() methodA(20); // 傳遞int引數,存取子類中的methodA(int) methodB(); // 直接存取,則永遠存取到的都是子類中的methodA(),基礎類別的無法存取到 super.methodB(); // 存取基礎類別的methodB() } }
子類物件構造時,需要先呼叫父類別的構造方法,然後執行子類的構造方法。
public class Base { public Base(){ System.out.println("Base()"); } } public class Derived extends Base{ public Derived(){ // super(); // 注意子類構造方法中預設會呼叫基礎類別的無參構造方法:super(), // 使用者沒有寫時,編譯器會自動新增,而且super()必須是子類構造方法中第一條語句, // 並且只能出現一次 System.out.println("Derived()"); } }
super和this都可以在成員方法中用來存取成員變數和呼叫其他的成員函數,都可以作為構造方法的第一條語句,那麼它們之間的區別是什麼?
(1)相同點
(2)不同點
【普通類】
【繼承關係上的執行順序】
【注】Java中不支援多繼承
組合和繼承都能實現程式碼的複用。組合沒有涉及到特殊的語法(如extend關鍵字),僅僅是將一個類的範例作為另一個類的屬性。
一般建議:能用組合儘量用組合
通過父類別型別的參照呼叫子類物件,向上轉型是安全的
【發生向上轉型的時機】
public class TestAnimal { // 2. 函數傳參:形參為父類別參照,可以接收任意子類的物件 public static void eatFood(Animal a) { a.eat(); } // 3. 作返回值:返回任意子類物件 public static Animal buyAnimal(String var) { if ("狗" == var) { return new Dog("狗狗", 1); } else if ("貓" == var) { return new Cat("貓貓", 1); } else { return null; } } public static void main(String[] args) { Animal cat = new Cat("元寶", 2); // 1. 直接賦值:子類物件賦值給父類別物件 Dog dog = new Dog("小七", 1); } }
優缺點:
函數名相同、參數列相同、返回值相同或是【協變型別】(父子類關係)
【方法重寫的規則】
【動態繫結和靜態繫結】
一個參照呼叫同一個方法,可以表現出不同的形式,這種思想稱為多型。在父類別的構造方法中不要呼叫重寫的方法。
【多型實現的條件】
public class Animal(){ String name; int age; public Animal(String name, int age){ this.name = name; this.age = age; } public void eat(){ System.out.println(name + "吃飯"); } } public class Cat extends Animal{ public Cat(String name, int age){ super(name, age); } @Override public void eat(){ System.out.println(name+"吃魚~~~"); } } public class Dog extends Animal { public Dog(String name, int age){ super(name, age); } @Override public void eat(){ System.out.println(name+"吃骨頭~~~"); } } public class TestAnimal { // 編譯器在編譯程式碼時,並不知道要呼叫Dog 還是 Cat 中eat的方法 // 等程式執行起來後,形參a參照的具體物件確定後,才知道呼叫那個方法 // 注意:此處的形參型別必須時父類別型別才可以 public static void eat(Animal a){ a.eat(); } public static void main(String[] args) { Animal animal1 = new Cat("元寶",2); Animal animal2 = new Dog("小七", 1); eat(animal1); eat(animal2); } }
【注】Java中所有的類預設繼承Object類
到此這篇關於Java 繼承與多型超詳細梳理的文章就介紹到這了,更多相關Java 繼承與多型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45