首页 > 其他分享 >多态的概述

多态的概述

时间:2024-11-20 10:47:32浏览次数:3  
标签:String food age 多态 概述 public name

1. 认识多态

面向对象三大特征:封装、继承、多态。

封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为

继承:多个对象共性的属性和方法进行抽取,解决代码重复的问题

继承是多态的前提条件

多态:同类型的对象,表现出的不同形态。对象的多种形态

多态的表现形式:

父类类型 对象名称 = 子类对象;

多态的前提:

  • 1.有继承关系

  • 2.有父类引用指向子类对象

  • 3.有方法重写。

  • Fu f = new Zi();

多态的好处:

  • 使用父类型作为参数,可以接收所有子类对象。

  • 体现多态的扩展性与便利。

2. 多态调用成员的特点

变量调用:编译看左边,运行也看左边

方法调用:编译看左边,运行看右边

Fu f = new Zi();

左边是父类

调用成员变量:(成员变量会被继承下来)

编译看左边:Javac编译代码的时候,会看左边的父类有没有这个变量,如果有,编译成功,如果没有编译失败。

运行也看左边:Java运行代码的时候,实际获取的就是左边父类中成员变量的值。

调用成员方法:(成员方法,重写的方法,在虚方法表中会把父类的方法进行覆盖)

编译看左边:Javac编译代码的时候,会看左边的父类中有没有这个方法,如果有编译成功,如果没有,编译失败。

运行看右边:java运行代码的时候,实际上运行的是子类中的方法。

3. 多态的优势和弊端

多态的优势: 在多态形态下,右边对象可以实现解耦合,便于扩展和维护。

定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

多态的弊端:

不能调用子类的特有功能。

原因? 当调用成员方法的时候,编译看左边,运行看右边。

那么在编译的时候会先检查左边的父类有没有这个方法,如果没有直接报错。

解决方案:

强制类型转换:

将调用类型变回子类类型就可以

转换的时候,要转换成对应的类型,不可以瞎转,否则会报错。

在转换的时候判断要转换的类型是否一致:

if(a instanceof Dog) 布尔类型,如果是结果为true。

新特性: 将判断和强转合在一起

if(a instanceof Dog d) 先判断a是否为Dog类型,如果是,则强转为Dog类型,转换之后变量名为d

如果不是,则不强转,结果直接为false。

4. 多态的综合练习。

 动物类:

package polymorphism;

public class Animal {
    private String color;
    private int age;
    //构造方法

    public Animal() {
    }

    public Animal(String color, int age) {
        this.color = color;
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(String food) {
        System.out.println("动物在吃 " + food);
    }
}
​
狗类:
package polymorphism;

public class Dog extends Animal {
    //构造方法

    public Dog() {
    }

    public Dog(String color, int age) {
        super(color, age);
    }
    @Override
    public void eat(String food){
        System.out.println(getAge() +"岁的"  + getColor() + "的狗两只前腿死死的抱着" + food + "猛吃。");
    }
    public void lookHome(){
        System.out.println("狗在看家。");
    }
}
​
人类:
package polymorphism;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    /*public void keepPet(Dog dog, String food) {
        System.out.println("年龄为" + age + "岁的" + name + "养了一只"+dog.getColor()+"的"+
                dog.getAge() +"岁的狗");
        dog.eat(food);
    }
    public void keepPet(Cat cat, String food) {
        System.out.println("年龄为" + age + "岁的" + name + "养了一只"+cat.getColor()+"的"+
                cat.getAge() +"岁的猫");
        cat.eat(food);
    }
     */
    //使用强转完成方法的调用
    public void keepPet(Animal a, String food) {
        if(a instanceof Dog d){
            System.out.println("年龄为" + age + "岁的" + name + "养了一只"+d.getColor()+"的"+
                    d.getAge() +"岁的狗");
            d.eat(food);
        } else if (a instanceof Cat c) {
            System.out.println("年龄为" + age + "岁的" + name + "养了一只"+c.getColor()+"的"+
                    c.getAge() +"岁的猫");
            c.eat(food);
        }else{
            System.out.println("没有这种动物");
        }
    }
}
测试类:
package polymorphism;

public class Test {
    public static void main(String[] args) {
        Person p = new Person("大黄",59);
        Dog dog = new Dog("棕色",4);
        p.keepPet(dog,"chicken");

    }
}

标签:String,food,age,多态,概述,public,name
From: https://blog.csdn.net/m0_57132040/article/details/143904924

相关文章

  • c-Kit/SCF信号轴概述及病理生理作用
    前 言受体酪氨酸激酶是正常细胞功能必不可少的,其功能障碍与多种疾病相关。c-Kit属于Ⅲ型受体酪氨酸激酶,参与细胞内信号传导。c-Kit及其配体SCF在胚胎发育和人类癌症的进展中发挥至关重要的作用。c-Kit/SCF的异常信号传导是某些癌症中癌症干性的重要促进因素。c-Kit的功能决......
  • 一句话概述10个主流CRM系统的特点以及适用企业
    商业环境瞬息万变,客户关系管理(CRM)系统帮助企业更好地连接客户、理解客户、服务客户,已成为企业不可或缺的战略资产。企业在选择CRM系统时,应做好充分的市场调查。为了帮助企业更好地把握市场机遇,提升客户体验,本文根据搜索结果和行业专家的评价,推荐的2024年CRM系统Top10,并介绍它们......
  • C++语言之多态
    多态是面向对象编程中的一个重要概念,它是指同一个行为具有多个不同表现形式或形态的能力。比如,在不同的类中可以定义同名的方法,这些方法可以根据对象的类型不同而执行不同的逻辑。多态可以通过继承和接口实现,在继承关系中,子类重写父类的方法,当使用父类引用指向子类对象时,调用......
  • 3.1数据链路层概述
    001物理层解决两个节点用任意信号都可以传输比特流的问题;但是分组发送的报文如何重新排序?线路的多组报文谁是接受站点?比特流识别出问题怎么办?数据链路层:一个节点通过数据链路向另一个节点传送帧(链路层的数据单元,网络层数据报的封装品),链路层不需要考虑物理层是如何实现的。链路......
  • 并发编程体系概述
    作者:京东自有品牌周振类别定义特点应用场景Java中的使用进程(Process)计算机程序在操作系统中执行的实例-独立性强、拥有独立的内存空间、创建和销毁开销大-进程间通信复杂-独立的应用程序-高隔离性任务,如数据库服务器-Java应用程序运行在JVM进程中-通过Pr......
  • Rust impl关键字(实现封装、继承和多态等功能)(Rust关联类型、impl关联类型、Rust静态方
    文章目录Rust中的`impl`关键字详解什么是`impl`关键字?`impl`的基本语法示例:为结构体实现方法`impl`与特征(Trait)(为类型实现通用接口)示例:为类型实现特征`impl`与关联类型(关联类型使得在特征中定义的一些类型可以在实现时具体化)示例:使用关联类型`impl`与静态方法(不带self......
  • 数据中心部分设计方案概述
    设计及响应原则数据中心的综合布线拓扑基于TIA-942标准,并为适合数据中心这样更为集中的环境做了改进。通常,水平布线区域是作为两种主要线缆类型之间、水平与主干之间的分割点。综合布线包括了配线架、终端模块、快捷跳线、以及线缆。必须要强调的是,这些组件应看作一个整体的系......
  • Scala-数据类型-概述(Scala 3.x 类型层次结构)
    ScalaScala-数据类型Scala1.`Any`—顶级类型2.`Matchable`—匹配类型3.`AnyVal`—值类型的父类4.`AnyRef`—引用类型的父类5.`Null`-引用类型的子类型Tips:为什么`null`不推荐使用?6.`Nothing`-底层类型(BottomType)整理不易,对您有帮助的话,还请......
  • HarmonyOS Next 加解密算法框架入门:基础概念与功能概述
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在当今数字化时代,信息安全犹......
  • 【JAVA】Java基础—面向对象编程:多态—多态的概念
    在Java编程中,多态是面向对象编程(OOP)的核心特性之一。它允许对象以多种形式存在,使得程序能够在运行时根据对象的实际类型调用相应的方法。这种特性不仅提高了代码的灵活性和可扩展性,还能减少代码重复,提高代码的可维护性。1.什么是多态?多态(Polymorphism)是指同一个操作作用于不......