• 面向对象三大特征之多态


     多态的概述(记忆)

    - 什么是多态

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

    - 多态的前提

      - 要有继承实现关系
      - 要有方法的重写
      - 要有父类引用指向子类对象

    重载和重写的区别如下(拓展)

    1.定义不同---重载是定义相同的方法名,参数不同;重写是子类重写父类的方法。

    2.范围不同---重载是在一个类中,重写是子类与父类之间的。

    3.多态不同---重载是编译时的多态性,重写是运行时的多态性。

    4.返回不同---重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型。

    5.参数不同---重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同。

    6.修饰不同---重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符。

    多态中的成员访问特点(记忆)

    - 成员访问特点

      - 成员变量

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

      - 成员方法

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

    为什么成员变量和成员方法的访问不一样呢?·

    • 因为成员方法有重写,而成员变量没有
    package com.object_02;
    
    public class AnimalDemo9 {
        public static void main(String[] args) {
            //有父类引用指向子类对象
            Animal9 a = new Cat9();
    
            System.out.println(a.age);
    //        System.out.println(a.weight);
    // 因为成员变量​编译看和运行看父类,父类中没有,所以weight报错
    // 运行出的age也是父类的40
    
            a.eat();
    //        a.playGame();
    //因为成员方法编译看父类,父类Animal中只有eat方法,所以playGame方法报错
    //因为运行看子类,所以eat方法运行的结果是子类重写后的"猫吃鱼"
        }
    }
    

    实例:

    1. package com.object_02;
    2. public class Animal9 {
    3. public int age = 40;
    4. public void eat() {
    5. System.out.println("动物吃东西");
    6. }
    7. }
    8. package com.object_02;
    9. public class Cat9 extends Animal9 {
    10. public int age = 20;
    11. public int weight = 10;
    12. @Override
    13. public void eat() {
    14. System.out.println("猫吃鱼");
    15. }
    16. public void playGame() {
    17. System.out.println("猫捉迷藏");
    18. }
    19. }
    20. package com.object_02;
    21. public class AnimalDemo9 {
    22. public static void main(String[] args) {
    23. //有父类引用指向子类对象
    24. Animal9 a = new Cat9();
    25. System.out.println(a.age);
    26. // System.out.println(a.weight);
    27. // 因为成员变量​编译看和运行看父类,父类中没有,所以weight报错
    28. // 运行出的age也是父类的40
    29. a.eat();
    30. // a.playGame();
    31. //因为成员方法编译看父类,父类Animal中只有eat方法,所以playGame方法报错
    32. //因为运行看子类,所以eat方法运行的结果是子类重写后的"猫吃鱼"
    33. }
    34. }

    多态的好处和弊端(记忆)

    - 好处

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

    - 弊端

      ​    不能使用子类的特有成员

    多态中的转型(应用)

    - 向上转型(从子到父)将子类对象赋值给父类

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

    格式:父类型 对象名 =new 子类型;

    1. //向上转型
    2. Animal a = new Cat();
    3. a.eat();
    4. // a.playGame(); //成员方法编译看父类,父类没有playGame方法,报错

    - 向下转型(从父到子)

    解决了多态的弊端,从而可以使用子类的特有成员  

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

    1. //向下转型
    2. Cat c = (Cat)a;
    3. c.eat();
    4. c.playGame(); //解决了多态的弊端,从而可以使用子类的特有成员  

    拓展:

    instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。

    instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

    以下实例创建了 displayObjectClass() 方法来演示 Java instanceof 关键字用法:

    1. import java.util.ArrayList;
    2. import java.util.Vector;
    3. public class Main {
    4. public static void main(String[] args) {
    5. Object testObject = new ArrayList();
    6. displayObjectClass(testObject);
    7. }
    8. public static void displayObjectClass(Object o) {
    9. if (o instanceof Vector)
    10. System.out.println("对象是 java.util.Vector 类的实例");
    11. else if (o instanceof ArrayList)
    12. System.out.println("对象是 java.util.ArrayList 类的实例");
    13. else
    14. System.out.println("对象是 " + o.getClass() + " 类的实例");
    15. }
    16. }

    以上代码运行输出结果为:

    对象是 java.util.ArrayList 类的实例

  • 相关阅读:
    【存储RAID】存储RAID常见模式及其特点
    好用的Android软件汇总
    封装axios并实现发送请求前如果有正在执行的请求就取消请求
    写了个开源小中间件——运行时动态日志等级开关
    18-Linux系统服务
    vue-slot插槽
    【小程序源码】花体字转换器支持多种花样字体不同风格
    Spring注解简析
    ElementUI浅尝辄止28:Dropdown 下拉菜单
    [工业自动化-23]:西门子S7-15xxx编程 - 软件编程 - 西门子PLC人机界面交互HMI功能概述、硬件环境准备、软件环境准备
  • 原文地址:https://blog.csdn.net/clover_oreo/article/details/125462218