• 【Java】多态


    简介:多态

    在这里插入图片描述

    1.多态

    1.简介

    在继承/实现的基础上的一种多种表现,可以是对象多态、行为多态。

    在这里插入图片描述

    package d1;
    
    public class Test {
        public static void main(String[] args) {
            People p1 = new Student();//对象多态
            p1.run();//行为多态
        }
    }
    
    
    package d1;
    
    public class Student extends People{
        public void run()
        {
            System.out.println("Student run!");
        }
    }
    
    
    package d1;
    
    public class People {
        public void run()
        {
            System.out.println("People run!");
        }
    }
    
    


    前提:

    • 继承/实现关系
    • 父类引用子类对象,即People p1 = new Teacher();
    • 存在方法重写

    注意:多态是针对于方法来说的,并不针对于变量
    在这里插入图片描述

    package d1;
    
    public class Test {
        public static void main(String[] args) {
            People p1 = new Student();//对象多态
            p1.run();//行为多态
            System.out.println(p1.name);
        }
    }
    
    

    输出结果
    在这里插入图片描述

    2.多态的好处

    • 可以实现解耦合,右边对象随时更换,方便代码维护。
    • 可以使用父类类型的变量作为形参,便于接受一切子类对象。
      在这里插入图片描述

    3.多态的缺点及解决

    缺点:多态下不能直接调用子类的独有功能。
    在这里插入图片描述
    为了解决上面说的多态缺点,提供下面方法。
    方法解决:需要调用子类单独的方法时候,进行强制类型转换
    在这里插入图片描述
    在这里插入图片描述
    可以通过instanceof来进行判断强转哪个类型:
    在这里插入图片描述

    package d2;
    
    public class Test {
        public static void main(String[] args) {
            People p1 = new Student();//好处1:右边的类型可以随时更换
            p1.run();//行为多态
            System.out.println(p1.name);
    
            //好处2:可以使用父类作为形参,进而接受所有子类的形参
            People p2 = new Teacher();
            go(p1);
            go(p2);
    
            //正常的强制类型转换
            //(Student)p1.study();
            Student s1 = (Student)p1;
            s1.study();
    
            //崩溃
            //People p = new Teacher();
            //Student s = (Student)p;// 实际上p是老师类,转换为学生类与原类型不符,报错
        }
    
        public static void go(People p)
        {
            System.out.println("p.name(这个地方提供函数即可)" + "go");
        }
    }
    
    

    instanceof的使用:

    package d2;
    
    public class Test {
        public static void main(String[] args) {
            People p1 = new Student();//好处1:右边的类型可以随时更换
    
            if(p1 instanceof Student)
            {
                Student s2 = (Student)p1;
                s2.study();
            }
            else
            {
                Student t2 = (Student)p1;
                t2.study();
            }
        }
    
        public static void go(People p)
        {
            System.out.println("p.name(这个地方提供函数即可)" + "go");
        }
    }
    
    

    输出结果
    在这里插入图片描述

    2.final关键字

    在这里插入图片描述

    final + 变量

    在这里插入图片描述

    常量

    在这里插入图片描述

    3.抽象类(特殊的父类)

    3.1简单介绍

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    3.2意义

    抽象类的引入是为了更好的去支持多态这一语法。

    我们常用来给父类设置为抽象类,然后用子类去重写父类的方法,这样可以支持子类的不同行为。多态的原则是编译看左边,运行看右边,而抽象类的引入是为了让编译过掉,而不至于报错,当然抽象类仅仅是解决这一问题的一种方案。

    实例:
    在这里插入图片描述
    在这里插入图片描述

    3.3模板方法设计模式

    作用:用来大量解决方法代码重复问题。
    在这里插入图片描述
    举例:写一篇作文《我的爸爸》,首尾相同,正文不同。
    在这里插入图片描述

    注:模板方法+final修饰,可以防止该方法被重写从而导致模板失效问题。
    在这里插入图片描述

    4.接口

    4.1概述

    Java提供了一个特殊关键字:interface,用来定义接口。

    接口的声明

    语法格式:
    在这里插入图片描述

    注:接口不能实例化创建对象,接口是用来被实现类实现的。
    在这里插入图片描述

    接口的实现:

    接口不能创建对象;接口是用来被类实现的,实现接口的类被称为实现类。
    在这里插入图片描述
    不同于类的继承,一个类可以实现多个接口,必须重写所有接口的全部抽象方法,或者实现类定义为抽象类也可以。

    在这里插入图片描述

    4.2接口意义(重点)

    • 弥补了类单继承的不足,一个类可以同时实现多个接口。
      在这里插入图片描述

    • 让程序员面向接口编程,让程序员更加灵活的切换各种业务实现。
      在这里插入图片描述

    4.3接口的实例

    在这里插入图片描述
    学生类
    在这里插入图片描述

    学生管理类
    在这里插入图片描述
    学生操作接口
    在这里插入图片描述

    学生操作1类
    在这里插入图片描述

    学生操作2类
    在这里插入图片描述

    4.4JDK8之后,接口语法新增

    简单介绍

    在这里插入图片描述

    使用

    默认方法可以在Test中通过类对象的方式调用,也可以在实现类中使用。
    在这里插入图片描述

    私有方法只能在A中的默认方法和A中的其他私有方法中使用。
    在这里插入图片描述

    类方法可以在Test和子类和自己中都可以使用,不过得用类名的方式进行调用。
    在这里插入图片描述

    意义

    增强了接口的权限,便于对大量的接口实现类进行维护。

    4.5接口的注意事项

    • 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承
    • 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现
    • 一个类继承父类且又同时实现了接口,父类和接口中有同名的默认方法,实现类会优先使用父类的
    • 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    EOF

  • 相关阅读:
    基于Spring Boot的大学校园防疫与服务系统毕业设计源码111556
    GeoServer:Vector Tiles-矢量瓦片制作与加载
    Python机器学习 | AI芯片调研
    序列模型(一)- 循环序列模型
    容器云资源数据关联与数据联动的难点和解决思路
    计算机网络实验——基于TCP协议的socket编程
    React Query:高效管理API请求与缓存
    VMware找不到父磁盘 父虚拟磁盘在子虚拟磁盘创建之后被修改过。父虚拟磁盘的内容 ID 与子虚拟磁盘中对应的父内容 ID 不匹配
    【小程序项目开发 -- 京东商城】uni-app 商品分类页面(下)
    深度学习入门(八) 多层感知机
  • 原文地址:https://blog.csdn.net/2302_79031646/article/details/139630375