目錄
1,多态
1.1:多态的概述(記憶)
1.2:多态中的成員通路特點(記憶)
1,多态
1.1:多态的概述(記憶)
-
什麼是多态
同一個對象,在不同時刻表現出來的不同形态
- 多态的前提
- 要有繼承或實作關系
- 要有方法的重寫
- 要有父類引用指向子類對象
- 代碼示範
class Animal {
public void eat(){
System.out.println("動物吃飯");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}
}
public class Test1Polymorphic {
/*
多态的前提:
1. 要有(繼承 \ 實作)關系
2. 要有方法重寫
3. 要有父類引用, 指向子類對象
*/
public static void main(String[] args) {
// 目前事物, 是一隻貓
Cat c = new Cat();
// 目前事物, 是一隻動物
Animal a = new Cat();
a.eat();
}
}
1.2:多态中的成員通路特點(記憶)
- 成員通路特點
-
成員變量
編譯看父類,運作看父類
-
成員方法
編譯看父類,運作看子類
- 代碼示範
class Fu {
int num = 10;
public void method(){
System.out.println("Fu.. method");
}
}
class Zi extends Fu {
int num = 20;
public void method(){
System.out.println("Zi.. method");
}
}
public class Test2Polymorpic {
/*
多态的成員通路特點:
成員變量: 編譯看左邊 (父類), 運作看左邊 (父類)
成員方法: 編譯看左邊 (父類), 運作看右邊 (子類)
*/
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);
f.method();
}
}
1.3:多态的好處和弊端(記憶)
-
好處
提高程式的擴充性。定義方法時候,使用父類型作為參數,在使用的時候,使用具體的子類型參與操作
-
弊端
不能使用子類的特有成員
1.4:多态中的轉型(應用)
-
向上轉型
父類引用指向子類對象就是向上轉型
-
向下轉型
格式:子類型 對象名 = (子類型)父類引用;
- 代碼示範
class Fu {
public void show(){
System.out.println("Fu..show...");
}
}
class Zi extends Fu {
@Override
public void show() {
System.out.println("Zi..show...");
}
public void method(){
System.out.println("我是子類特有的方法, method");
}
}
public class Test3Polymorpic {
public static void main(String[] args) {
// 1. 向上轉型 : 父類引用指向子類對象
Fu f = new Zi();
f.show();
// 多态的弊端: 不能調用子類特有的成員
// f.method();
// A: 直接建立子類對象
// B: 向下轉型
// 2. 向下轉型 : 從父類類型, 轉換回子類類型
Zi z = (Zi) f;
z.method();
}
}
1.5:多種中轉型存在的風險和解決方案(應用)
-
風險
如果被轉的引用類型變量,對應的實際類型和目标類型不是同一種類型,那麼在轉換的時候就會出現ClassCastException
- 解決方案
-
關鍵字
instanceof
-
使用格式
變量名 instanceof 類型
通俗的了解:判斷關鍵字左邊的變量,是否是右邊的類型,傳回boolean類型結果
- 代碼示範
abstract class Animal {
public abstract void eat();
}
class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
public void watchHome(){
System.out.println("看家");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("貓吃魚");
}
}
public class Test4Polymorpic {
public static void main(String[] args) {
useAnimal(new Dog());
useAnimal(new Cat());
}
public static void useAnimal(Animal a){ // Animal a = new Dog();
// Animal a = new Cat();
a.eat();
//a.watchHome();
// Dog dog = (Dog) a;
// dog.watchHome(); // ClassCastException 類型轉換異常
// 判斷a變量記錄的類型, 是否是Dog
if(a instanceof Dog){
Dog dog = (Dog) a;
dog.watchHome();
}
}
}