首页 > 编程语言 >Java零基础入门-多态

Java零基础入门-多态

时间:2024-04-08 11:29:15浏览次数:28  
标签:调用 Java 入门 子类 Dog 多态 父类 public

一、概述

        我之前上几期是教学了java类、及面向对象编程的三大基本特性,封装继承和多态。前一期,我是把继承大致讲了一遍,不知道你们对它有没有理解,何为继承,继承有啥好处,可以多继承嘛?等这类问题,我在上一期内容都有讲解,如果你们答不出来,没关系,你们可以再回去瞅瞅。

        而这一期,我们要来学习一个新概念--多态,是继封装、继承之后,面向对象的第三大特性。好的,废话不多说,咱这就开始。

二、本期教学目标

  • 何为多态?
  • 实现多态的前提条件?
  • 如何实现多态?
  • 多态有何优劣?
  • 什么是向上转型和向下转型?
  • 多态实例演示
  • ...

三、正文

1️⃣概述

        说起多态,你们从字面意思上肯定无法理解,没关系,我给大家讲个与生活息息相关的例子,比如啊,对于吃饭这个动作,人是用手用筷子,鸡是嘴琢,鱼是用嘴吸,对于跑这个动作,人跑、鸟跑、猫跑、鸵鸟跑等都是不一样的,对于飞这个动作,飞机、鸟、大雁、飞鱼等展示形式也是不一样的。虽然行为都是一样,但通过不同的事物,对于行为的具体表现都是不一样的,这就是多态。多态,形容的就是这种对于同一行为却表现出多种形态的现象。

2️⃣定义

        多态:准确来说,是指对同一行为,对于不同的对象有具体表现不同形式。而对于对象多态,表示对同一方法,不同对象具有不同的实现方法形式。

3️⃣前提条件

        要实现多态,那它有那些前提呢?

  • 继承或者实现。
  • 实现方法重写。
  • 父类引用指向子类对象或者接口引用指向实现类对象。

4️⃣多态优劣

        那对于多态而言,有何优势又有何劣势呢?这点我分开给大家逐一讲解一下。

  1. 优势:在实际开发过程中,父类类型作为方法形式参数,传递给子类方法,进行方法调用,更能体现出多态的可拓展性与便利性
  2. 劣势:多态情况下,只能调用父类的共性内容,不能调用子类特有的内容(方法、属性等)

5️⃣实现多态

        如下实现多态?多态往往体现在父类的引用指向它的子类,比如:

父类类型 变量名 = new  子类对象;

变量名.方法名();

6️⃣向上转型

        为何要说到这个概念呢?这也是为了弥补因为多态这个特点而导致用父类变量接收子类对象之后,就不能调用子类所特有的方法了(父类没有)这个小问题,所以就需要向上转型,当左边变量类型大于右边对象变量类型,将该过程就成为向上转型,比如:

// 向上转型  
Animal dog = new Dog();  

        此时,dog对象按编译时按照左边变量类型(Animal)处理,就只能调用父类(Animal)中有的变量和方法,而不能调用子类特有的变量和方法了。

大家请看:

public class Dog extends Animal{//子类

    private String active;

    @Override
    public void eat(){
        System.out.println("我是狗狗,吃骨头!");
    }

    public void run(){
        System.out.println("我是狗狗,我会跑!");
    }

    public static void main(String[] args) {

        Animal dog = new Dog();
        dog.eat();
    }

}

        dog对象是无法调用自身的run()方法和自定义的属性。

7️⃣向下转型

        所以对于有向上转型,就有向下转型,相反,向下转型就是当左边变量类型小于右边变量类型,我们就称为向下转型。此刻,编译期间,按照左边变量类型处理,就可以调用子类特有的方法和属性了。比如:

    public static void main(String[] args) {

        Animal dog1 = new Dog();
        dog1.eat();
        
        if (dog1 instanceof Dog){

            Dog dog2 = (Dog)dog1;  //向下转型
            dog2.run();        // 调用的是Dog的run()方法
        }
    }

        解释一下:为了避免ClassCastException异常,Java有专门提供 instanceof 关键字,作用就是给引用变量做类型校验,只要用instanceof判断如果返回true,那么强转为该类型就一定是安全的,借此也不会报ClassCastException异常。

四、实例演示

        接下来我给大家举个例子,重点演示一下。

先来定义一个父类。

@Data
public class Animal {//父类

    private String type;
    private String name;
    private String color;

    public void eat() {
        System.out.println("我是父类,吃东西!");
    }
    
}

然后再来定义个子类Dog。

@Data
public class Dog extends Animal {//子类

    private String active;

    @Override
    public void eat() {
        System.out.println("我是狗狗,吃骨头!");
    }

    //独有功能
    public void lockHome() {
        System.out.println("我是狗狗,我会看家");
    }
}

        大家可以看到,dog2对象可以调用Dog类的lockHome()方法,该dog1是无法调用的,但dog2可以调用,这就是向下转型所致。

 总结:

  • 成员变量:只看编译时类型, 成员变量没有重写。访问的是父类的成员变量。
  • 非虚方法:只看编译时类型,也就是访问的是父类中的方法。

标签:调用,Java,入门,子类,Dog,多态,父类,public
From: https://blog.csdn.net/weixin_66592566/article/details/125426658

相关文章

  • java8 Lambda 异常处理
    异常接口publicclassTry{ publicstatic<T>Consumer<?superT>of(UncheckedConsumer<T>action){ Objects.requireNonNull(action); returnt->{ try{ action.accept(t); }catch(Exceptione){ thrownewRuntimeExcepti......
  • JavaScript性能优化
    JavaScript性能优化JavaScript是前端开发中最常用的脚本语言之一,优化它的性能可以有效地提升页面响应速度和流畅度。下面介绍一些常见的JavaScript性能优化方法: 1.函数节流函数节流是指在一定时间内只执行一次函数,比如鼠标滚动事件,如果没有限制,那么每次鼠标滚动都会触发大量......
  • Java 方法真人游戏网站app
    在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢?println()是一个方法。System是系统类。out是标准输出对象。这句话的用法是调用系统类System中的标准输出对象out中的方法println()。那么什么是方法呢?Java方法是语句的集合,它们在......
  • Java中null和空的区别
    null是没有地址,会报空指针异常即报错。""是有地址但是里面的内容是空的。问题一:null和""的区别......
  • 如何使用Java和RabbitMQ实现延迟队列(方式二)?
    前言昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章,今天来讲下另外一种方式,不需要RabbitMQ的插件。前期准备,需要安装好docker、docker-compose的运行环境。需要安装RabbitMQ的可以看下面这篇文章。如何使用PHP和RabbitMQ实现消息队列?-CSDN博客使用RabbitM......
  • 如何使用Java和RabbitMQ实现延迟队列?
    前言今天我们使用Java和RabbitMQ实现消息队列的延迟功能。前期准备,需要安装好docker、docker-compose的运行环境。需要安装RabbitMQ的可以看下面这篇文章。如何使用PHP和RabbitMQ实现消息队列?-CSDN博客今天讲的是依赖RabbitMQ的延迟插件实现消息队列的延迟功能。如何安装......
  • 学习Java Day3-05 (流程控制-循环结构while,do……while,for,增强for)
    循环结构while循环do…while循环for循环在Java5中引入了一种主要用于数组的增强型for循环。while循环while是最基本的循环,它的结构为:while(布尔表达式){ //循环内容}只要布尔表达式为ture,循环就会一直执行下去。我们大多数情况是会让循环停止下来的,我们需要一......
  • javaweb codereview记录-03
    Class类加载流程实际上就是ClassLoader将会调用loadclass来尝试加载类,首先将会在jvm中尝试加载我们想要加载的类,如果jvm中没有的话,将调用自身的findclass,此时要是findclass重写了,并且传入了我们想要加载的类的字节码,那么应该调用defineclass在jvm中加载该类,最后返回java.lang.......
  • Vue3入门笔记【黑马】
    目录:认识Vue31.Vue3的优势使用create-vue搭建Vue3项目1.认识create-vue2.使用create-vue创建项目熟悉项目和关键文件组合式API-setup选项1.setup选项的写法和执行时机2.setup中写代码的特点3.setup语法糖组合式API-reactive和ref函数1.reactive2.ref3.re......
  • 计算机毕业设计项目:springboot 智能答疑系统 96852(开题答辩+程序定制+全套文案 )上万套
    毕业论文(设计) 题   目springboot智能答疑系统学   院       XXXXX     专业班级   XXXXX学生姓名       XXXX    指导教师            XXXX          撰写日期:202 年 月 日目 录摘要......