Test.java
/*
* 多態(tài)
* 多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力
*/
/*
* 多態(tài)的優(yōu)點
* 1. 消除類型之間的耦合關(guān)系
* 2. 可替換性
* 3. 可擴充性
* 4. 接口性
* 5. 靈活性
* 6. 簡化性
多態(tài)存在的三個必要條件
繼承
重寫
父類引用指向子類對象
*/
/*
* 當(dāng)使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調(diào)用子類的同名方法。
* 多態(tài)的好處:可以使程序有良好的擴展,并可以對所有類的對象進行通用處理。
*/
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 對象調(diào)用 show 方法
show(new Dog()); // 以 Dog 對象調(diào)用 show 方法
Animal a = new Cat(); // 向上轉(zhuǎn)型
a.eat(); // 調(diào)用的是 Cat 的 eat
Cat c = (Cat)a; // 向下轉(zhuǎn)型
c.work(); // 調(diào)用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 類型判斷
if (a instanceof Cat) { // 貓做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃魚");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
public void work() {
System.out.println("看家");
}
}
Employee.java
/*
* 虛函數(shù)
* 虛函數(shù)的存在是為了多態(tài)。
* Java 中其實沒有虛函數(shù)的概念,它的普通函數(shù)就相當(dāng)于 C++ 的虛函數(shù),動態(tài)綁定是Java的默認行為。如果 Java 中不希望某個函數(shù)具有虛函數(shù)特性,可以加上 final 關(guān)鍵字變成非虛函數(shù)。
* 重寫
* 我們將介紹在 Java 中,當(dāng)設(shè)計類時,被重寫的方法的行為怎樣影響多態(tài)性。
* 我們已經(jīng)討論了方法的重寫,也就是子類能夠重寫父類的方法。
* 當(dāng)子類對象調(diào)用重寫的方法時,調(diào)用的是子類的方法,而不是父類中被重寫的方法。
* 要想調(diào)用父類中被重寫的方法,則必須使用關(guān)鍵字 super
*/
public class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Employee 構(gòu)造函數(shù)");
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck() {
System.out.println("郵寄支票給: " + this.name
+ " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}
Salary.java
public class Salary extends Employee {
private double salary; // 全年工資
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
setSalary(salary);
}
public void mailCheck() {
System.out.println("Salary 類的 mailCheck 方法 ");
System.out.println("郵寄支票給:" + getName()
+ " ,工資為:" + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if(newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("計算工資,付給:" + getName());
return salary/52;
}
}
VirtualDemo.java
public class VirtualDemo {
public static void main(String[] args) {
Salary s = new Salary("員工 A", "北京", 3, 3600.00);
Employee e = new Salary("員工 B", "上海", 2, 2400.00);
System.out.println("使用 Salary 的引用調(diào)用 mailCheck -- ");
s.mailCheck();
System.out.println("\n使用 Employee 的引用調(diào)用 mailCheck--");
e.mailCheck();
}
}
Java 多態(tài)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 問題 如果在一個構(gòu)造器內(nèi)部,調(diào)用正在構(gòu)造的對象的某個動態(tài)綁定方法,那會發(fā)生什么情況呢? 代碼 輸出結(jié)果 結(jié)論 類初...
- 多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。 abstract class Animal { void ea...
- 1、面向?qū)ο蟮娜蠡咎卣鳎悍庋b、繼承、多態(tài) 2、多態(tài)是指:父類引用指向子類對象,在執(zhí)行期間判斷所引用對象的實際類...
- 作為一門面向?qū)ο笳Z言,Java 擁有封裝、繼承、多態(tài)三大特性。多態(tài)就是允許不同類的對象對同一消息做出響應(yīng)。基于多態(tài)...