• 人生苦短我学Java9面向对象三大特性之多态 广深


    一、多态

    1、什么是多态?

    • 多种形态
    • 是指一个对象在不同时刻,表现出来不同的状态
    • 比如说,水滴,液态、气态、固态。

    2、多态的前提条件

    • 要有继承关系
    • 要有方法重写
    • 要有父类引用指向子类对象

    口诀:
    1.在多态,成员变量/静态方法/静态变量 编译、运行看左边。
    2.在多态,方法重写编译看左边、运行看右边。

    package com.ppl.day;
    /*
    com.ppl.day:学习项目
    @user:广深-小龙
    @date:2022/1/3 15:51
    */
    
    /*
    口诀:
    1.在多态,成员变量/静态方法/静态变量 编译、运行看左边。
    2.在多态,方法重写编译看左边、运行看右边。
    */
    public class Day13 {
        public static void main(String[] args) {
            Fu1 f = new Zi1();
            System.out.println(f.i);
            System.out.println(f.j);  // Fu1 没有变量 j
    
            f.print();
            f.printFu();
        }
    }
    
    class Fu1 {
        int i = 1;
        int j = 3;
    
        public void printFu() {
            System.out.println("printFu");
        }
    
        public void print() {
            System.out.println("Fu1");
        }
    }
    
    class Zi1 extends Fu1 {
        int j = 2;
    
        public void print() {
            System.out.println("Zi1");
        }
    }

    输出:

    1
    3
    Zi1
    printFu

     3、多态的优劣

    优点:

    • 提高代码扩展性
    • 父类引用作为形式参数,子类对象作为实际参数
    /*
    多态的应用
    1.提高代码扩展性
    2.父类引用作为形式参数,子类对象作为实际参数
    */
    class Anima {
        public void eat() {
        }
    }
    
    class AnimalTool {
    
        // 继承结合多态的应用,一个工具类的方法即可
        public static void print(Anima anima) {
            anima.eat();
        }
        
        // 原每个子类调用时,都需要+一个工具类方法
    //    public static void print(Cat cat) {
    //        cat.eat();
    //    }
    //    public static void print(Dog dog) {
    //        dog.eat();
    //    }
    }
    
    class Cat extends Anima {
        public void eat() {
            System.out.println("猫吃鱼...");
        }
    }
    
    class Dog extends Anima {
        public void eat() {
            System.out.println("狗啃骨头...");
        }
    }

    缺点:

    • 父类引用不能使用子类中的内容,解决:向下转型
    package com.ppl.day;
    /*
    com.ppl.day:学习项目
    @user:广深-小龙
    @date:2022/1/3 16:46
    */
    
    public class Day14 {
        public static void main(String[] args) {
            PPerson p = new Student();  // 向上转型
            p.eat();    ////        p.play(); // 编译看左边,左边p没该方法,所以报错,需要向下转型
    
            Student s = (Student) p;  // 向下转型
            s.play();
        }
    }
    
    class PPerson {
        public void eat() {
            System.out.println("吃...");
        }
    }
    
    class Student extends PPerson {
        public void eat() {
            System.out.println("学生吃面条...");
        }
    
        public void play() {
            System.out.println("学生玩游戏...");
        }
    }

    注意:PPerson p = new Student(); // 向上转型

    向下转型时必须是 Student x = (Student)p,不能是其它;否则运行时报错,编译不会报错。ClassCastException

    多态:同一个对象在不同时刻表现不同的状态。可上下转型。如狗 --> 动物 --> 生物

     欢迎来大家QQ交流群一起学习:482713805,博主微信+:gogsxl

  • 相关阅读:
    盘点Spring Boot最核心的27个注解
    一份非常完整的 MySQL 规范
    一份非常完整的 MySQL 规范
    Restful API 中的错误处理方案
    Restful API 中的错误处理方案
    一文总结 CPU 基本知识
    RPM软件管理工具
    yum仓库配置
    spring配置和下载
    spring的IOC 的底层实现原理
  • 原文地址:https://www.cnblogs.com/gsxl/p/15759794.html
Copyright © 2020-2023  润新知