> 文章列表 > Java面向对象三剑客之——多态

Java面向对象三剑客之——多态

Java面向对象三剑客之——多态

Java面向对象三剑客之——多态

文章目录

    • 前言
    • 📕多态的概述
    • 📕多态中的成员访问特点
    • 📕多态的好处和弊端
    • 📕多态中的转型
    • 📕多态中转型存在的风险和解决方案
    • 最后说一句

前言

今天我们来学习Java多态的知识。在Java中,多态是一种强大的特性,它允许我们在运行时根据不同的对象类型来执行不同的操作,从而使代码更加灵活和可扩展。让我们来探索Java多态的奥秘!

在这里插入图片描述

📕多态的概述

  • 什么是多态

    ​ 同一个对象,在不同时刻表现出来的不同形态

  • 多态的前提

    • 要有继承或实现关系
    • 要有方法的重写
    • 要有父类引用指向子类对象
  • 代码演示

    class Animal {public void eat(){System.out.println("动物吃饭");}
    }class Cat extends Animal {@Overridepublic 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();}
    }
    

📕多态中的成员访问特点

  • 成员访问特点

    • 成员变量

      ​ 编译看父类,运行看父类

    • 成员方法

      ​ 编译看父类,运行看子类

  • 代码演示

    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();}
    }
    

在这里插入图片描述

📕多态的好处和弊端

  • 好处

    ​ 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

  • 弊端

    ​ 不能使用子类的特有成员
    在这里插入图片描述

📕多态中的转型

  • 向上转型

    ​ 父类引用指向子类对象就是向上转型

  • 向下转型

    ​ 格式:子类型 对象名 = (子类型)父类引用;

  • 代码演示

    class Fu {public void show(){System.out.println("Fu..show...");}
    }class Zi extends Fu {@Overridepublic 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();}
    }
    

📕多态中转型存在的风险和解决方案

在这里插入图片描述

  • 风险

    如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现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变量记录的类型, 是否是Dogif(a instanceof Dog){Dog dog = (Dog) a;dog.watchHome();}}
    }
    

在这里插入图片描述

最后说一句

感谢大家的阅读,文章通过网络资源与自己的学习过程整理出来,希望能帮助到大家。

才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以提出来,我会对其加以修改。

在这里插入图片描述