27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录

27.1为什么使用多态?

 27.1.2什么是多态

 27.1.3对象多态

 27.1.4多态的使用前提

27.2 向上转型

27.3向下转型

 (面试题)

 27.4抽象类和抽象方法

特点(面试题):


27.1为什么使用多态?

需求1:动物园让我们实现一个功能: 创建一个狗类 ,狗有eat()方法,再创建一个饲养员类,饲养

员有一个feed()方法,让饲养员喂养狗。

 

Dog:
public class Dog {
    private String name;

    public String getName() {
        return name;
    }

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

    public void eat(){
        System.out.println(name+"狗吃奥里给");
    }
}

 

Feeder
public class Test01 {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.setName("Jerry");

        Feeder f=new Feeder();
        f.feed(dog);
    }
}

 

需求2:此时动物园引进新品种 猫,此时需要创建一个猫类。并添加eat方法,让人类也能喂养猫。

需求3:此时动物园又引进了一种新动物,叫做pig猪 此时pig也有eat 并且 人类也需要喂养pig,请完成功能。

每次动物园引进新产品,都需要在饲养员类中增加一个方法,如果动物园有10000个动物,那么饲养员类中需要增加10000喂养的方法。

使用多态来解决上面代码耦合性。

 27.1.2什么是多态

多态:在继承实现情况下的一种现象,

表现为:对象多态、行为多态

 

 27.1.3对象多态

多态性:

允许你将父对象设置成为一个或更多的他的子对象相等的技术,

赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.

简单一句话:允许将子类类型赋值给父类类型

多态:

父类对象表现多种子类的形态的能⼒的特征,

⼀句话多态就是⽗类引用子类对象。

向同⼀个⽗类的不同⼦类发送同⼀条消息,⾏为不同。

 27.1.4多态的使用前提

必须有继承|实现关系

 Animal

package demo02;

/**
 * @program: day1106
 * @description:
 * @author: 闫克起2
 * @create: 2023-11-06 15:34
 **/
public class Animal {
    private String name;

    public void eat(){

    }

    public String getName() {
        return name;
    }

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

 Dog

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println(getName()+"吃奥里给");
    }
}

Cat  

public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println(getName()+"吃鱼");
    }
}

 Feeder

public class Feeder {

    //
    public void feed(Animal animal){//Animal animal=new Dog();
        animal.eat();
    }


}

 Test

package demo02;

/**
 * @program: day1106
 * @description:
 * @author: 闫克起2
 * @create: 2023-11-06 15:14
 **/
public class Test01 {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.setName("Jerry");

        Cat c=new Cat();
        c.setName("Tom");

        Feeder f=new Feeder();
        f.feed(dog);
        f.feed(c);
      
    }
}

如果在增加新的品种动物,无需修改Feeder饲养员类中的代码了。 解决耦合性。

 

  1. 包含小狗 小猫 小猪 有一个共同的方法会摆造型

打印机 能够打印动物的造型

良好的可扩展性和可维护性

27.2 向上转型

向上转型:⽗类引⽤⼦类对象(⾃动成⽴,缺点是失去调⽤⼦类独有⽅法的能⼒

父类 对象名=new 子类();

 Dog中的代码:

package com.ykq.duotai;
public class Dog extends Animal {
    // eat
    @Override
    public void eat(){
        System.out.println("我是一只狗,我喜欢吃奥里给!!!");
    }
    // 看家 watchDoor()
    public  void watchDoor(){
        System.out.println("狗会看门!!!");
    }
}

 test类:

Animal animal = new Dog();// 向上转型
 // dog 赋值给Animal
animal.eat();
animal.watchDoor(); // 报错

 

向上转型后该对象只能当成父类对象来用,

原来子类中定义的属性和方法就被屏蔽掉不能被调用了。

比如

狗里有一个【看门】的方法,

如果向上转型后作为【动物】类就不能调用dog类独有的【看门】的方法。

 总结: 向上转型 从小的转向大的 缺点:不能调用子类里面的特有的方法 .

  1. 能调用哪些方法看等号的左边。

  2. 执行哪个方法看等号的右边。

27.3向下转型

向下转型:⼦类引⽤⽗类对象(强制转换,慎重)

public static void main(String[] args) {
    // Dog
    Animal dog = new Dog();
    // ⼦类引⽤⽗类对象
    Dog dog1 = (Dog) dog;
    // 向下转型 可以调用子类里面方法   属性
    dog1.watchDoor();
    Cat cat = (Cat) dog;

}
 

 

此时可以调用子类对象中的方法和属性。

注意事项:ClassCastException

 

 (面试题)

 

以上为继承多态 占据5% 继承多态

继承多态,接口多态95%。

向下转型: 大的转化为小的

缺点:强制类型转换 ClassCastException类型转换异常

优点: 调用子类里面的独有的方法

 27.4抽象类和抽象方法

 抽象类表示现实中并不存在该类,只是为了代码的可用性而抽取的一个父类。

 

 

使用abstract修饰类和方法。

语法:

public abstract class 类名{

​      public abstract 返回类型 方法名(参数列表);

}

抽象类

/**
    1.抽象类使用abstract修饰. 该类中可以有抽象方法和普通方法.
    2.抽象类不能实例化对象.
    3.子类继承了抽象类,那么该子类需要重写抽象类中的所有抽象方法.
 **/
public abstract class Shape {

    //求面积
    public  void area(){};

    //求周长
    public abstract void perimeter();

    public void show(){
        System.out.println("普通方法");
    }
}

长方形子类

public class Rect extends Shape {
    @Override
    public void area() {
        System.out.println("长乘宽");
    }

    @Override
    public void perimeter() {
        System.out.println("长加宽乘2");
    }
}

 测试类:

public class Test {
    public static void main(String[] args) {
        Shape s=new Circle();//向上转型
        s.area();
        s.perimeter();
        s.show();
    }
}

特点(面试题):

1)抽象类不能new对象

   2)抽象类可以有构造方法,专门让子类调用的。(super(color, name))。

   3)抽象类中可以含有抽象方法,也可以没有抽象方法。

   4)抽象类中可以含有普通实例方法。  sleep()

   5)抽象方法必须使用abstract修饰,并且不能有方法体(不能有{})。

   6)子类继承抽象类时必须重写所有的抽象方法(参考demo2中的Cat),如果不重写自己必须是抽象类(参考demo2中的Dog)。

   7)含有抽象方法的类一定是抽象类。(把抽象类上的abstract去掉,看是否报错)

 

  1. 多态: 一个类对象具有多种形态。

  2. 对象的多态: 父类 对象名=new 子类对象(); 向上转型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/195789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cpu飙高问题,案例分析(二)——批处理数据过大引起的应用服务CPU飙高

上接cpu飙高问题,案例分析(一) 一、批处理数据过大引起的应用服务CPU飙高 1.1 问题场景 某定时任务job 收到cpu连续(配置的时间是180s)使用超过90%的报警; 1.2 问题定位 观察报警中的jvm监控,发现周期…

软件测试测试文档编写

在软件测试中的流程中,测试文档也是一个重要的流程,所以测试人员也需要学习测试文档的编写和阅读。 一、定义:   测试文档(Testing Documentation)记录和描述了整个测试流程,它是整个测试活动中非常重要…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 上一节把数据库与相关基础数据字典准备好,下面就来实现相应的功能,目前先针对自定义…

大学招聘平台既然存在逻辑漏

找到一个学校的就业信息网, 随便点击一个招聘会,并且抓包查看返回包 注意返回包中的dwmc参数,这个是公司名称,zplxr参数这个是招聘人员姓名,lxdh参数是电话号码,这几个参数后面有用 在第一张图点击单位登…

Python 爬虫 案例 之 豆瓣Top250电影数据

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 课程亮点: 1、动态数据抓包演示 2、csv文件保存 3、requests模块的使用 4、parsel解析数据的使用 环境介绍: python 3.8 pycharm 模块…

一种方便、优美的使用Python调用fofa API的方法

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。 学习网络安全的过程中,绕不开fofa搜索,我的需求是使用fofa获取互联网所…

C++不同平台下的RTTI实现

给定一个含有虚函数的对象的地址&#xff0c;找到对应的类名&#xff0c;不同平台下方法也不同&#xff0c;这是由于RTTI实现并没有统一的标准。 Linux&#xff1a; #include <iostream> #include <typeinfo>class Person { public:virtual void func(){std::cout…

[算法总结] - 蓄水池采样算法

问题描述 在长度为N的数组中&#xff0c;随机等概率选取K个元素&#xff0c;如何实现这个随机算法。 思路很简单&#xff0c;生成一个[0, N]的随机数index&#xff0c;然后返回index上的数值即可。 但是&#xff0c;如果输入是一个长度未知的数组比如stream&#xff0c;先遍历…

【Jmeter】什么是BeanShell?

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Prep…

中科大蒋彬课题组开发 FIREANN,分析原子对外界场的响应

内容一览&#xff1a; 使用传统方法分析化学系统与外场的相互作用&#xff0c;具有效率低、成本高等劣势。中国科学技术大学的蒋彬课题组&#xff0c;在原子环境的描述中引入了场相关特征&#xff0c;开发了 FIREANN&#xff0c;借助机器学习对系统的场相关性进行了很好的描述。…

盘点72个Android系统源码安卓爱好者不容错过

盘点72个Android系统源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1qiWeLjF2i4dlgmTYgPPSvw?pwd8888 提取码&#xff1a;8888 项目名称 A keyboardlisten…

【链接MySQL】教你用VBA链接MySQL数据库

hi&#xff0c;大家好呀&#xff01; 之前呢&#xff0c;给大家分享过一个自制链接表管理器的文章&#xff0c;文章中有链接SQL Server数据库的代码&#xff0c;大家对这一段代码比较有兴趣&#xff0c;既然大家有兴趣&#xff0c;那我们今天就来讲一下链接数据库的代码。 这…

Vue路由嵌套和携带参数的几种方法

1、路由嵌套 路由嵌套逻辑&#xff1a; router.index.js中使用children嵌套子路由 //该文件专门用于创建整个文件的路由器 import VueRouter from vue-routerimport About from "/pages/About"; import Home from "/pages/Home"; import News from "…

基础课12——深度学习

深度学习技术是机器学习领域中的一个新的研究方向&#xff0c;它被引入机器学习使其更接近于最初的目标——人工智能。深度学习的最终目标是让机器能够像人一样具有分析学习能力&#xff0c;能够识别文字、图像和声音等数据。 深度学习的核心思想是通过学习样本数据的内在规律…

控价是什么意思

对价格进行控制&#xff0c;使其在一个目标范围内的行为被称为控价&#xff0c;那为什么要做控价&#xff0c;控价的前提是价格乱了&#xff0c;而品牌会对渠道中的低价进行控制&#xff0c;这就是品牌进行控价的目标&#xff0c;控制低价。 品牌可以选择自己去控价&#xff0c…

python计算概率分布

目录 1、泊松分布 2、卡方分布 3、正态分布 4、t分布 5、F分布 1、泊松分布 泊松分布是一种离散概率分布&#xff0c;描述了在固定时间或空间范围内&#xff0c;某个事件发生的次数的概率分布。该分布以法国数学家西蒙德尼泊松的名字命名&#xff0c;他在19世纪早期对这种…

深入了解MySQL数据库管理与应用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 当涉及MySQL数据库管理与应用时&#xff0c;深…

智慧工地管理系统加快推进工程建设项目全生命周期数字化

智慧工地管系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 智慧工地以物联网、移动互联网技术为基础&#xff0c;充分应用大…

AIGC系列之:DDPM原理解读(简单易懂版)

目录 DDPM基本原理 DDPM中的Unet模块 Unet模块介绍 Unet流程示意图 DownBlock和UpBlock MiddleBlock 文生图模型的一般公式 总结 本文部分内容参考文章&#xff1a;https://juejin.cn/post/7251391372394053691&#xff0c;https://zhuanlan.zhihu.com/p/563661713&…

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间,例如,“loading”,“being”的存储映像如下图所示。

假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;可共享相同的后缀存储空间&#xff0c;例如&#xff0c;“loading”,“being”的存储映像如下图所示。 设str1和str2分别指向两个单词所在单链表的头结点&#xff0c;链表结点结构为 data ne…