java学习笔记8

news2025/12/25 18:42:29

15. 多态

15.1 多态概念

​ java中**多态(Polymorphism )**是指不同对象在调用相同名称方法时,表现的多种不同行为。例如,要实现一个动物叫的方法,由于每种动物的叫声不同,因此可以在方法中接收一个动物参数,当传入的是猫类时发出猫叫,传入狗类时发出狗的叫声。

​ java中多态允许父类的指针或引用指向子类的对象,并调用相应的方法。多态需要满足以下三个条件:

  1. 继承:子类继承父类,存在继承关系。
  2. 重写:子类对父类的方法进行实现或重写,从而可以展现子类的行为特征。
  3. 父类的指引指向子类的对象:可以将子类的对象赋给父类类型的引用。
15.1.1 继承普通类实现多态
public class Animal {
   
    void speak() {
   
        System.out.println("Animal speaks");
    }
}
 
public class Dog extends Animal {
   
    @Override
    void speak() {
   
        System.out.println("Dog barks");
    }
}
 
public class Cat extends Animal {
   
    @Override
    void speak() {
   
        System.out.println("Cat barks");
    }
}
 
public class PolymorphismExample {
   
    public static void main(String[] args) {
   
        Animal myAnimal = new Dog(); // 父类引用指向子类对象
        myAnimal.speak(); // 输出 "Dog barks",多态表现
        Animal myAnimal1 = new Cat(); // 父类引用指向子类对象
        myAnimal1.speak(); // 输出 "Cat barks",多态表现
    }
}
15.1.2 继承抽象类实现多态
abstract class Animal {
   
	abstract void shout();
}

// Cat继承Animal
class Cat extends Animal{
   
	// 实现父类的shout方法
	public void shout(){
   
		System.out.println("喵喵....");
	}
}

// Dog继承Animal
class Dog extends Animal{
   
	// 实现父类的shout方法
	public void shout(){
   
		System.out.println("汪汪....");
	}
}

public class PolymorphismExample{
   
    public static void main(String[] args) {
   
        Animal dog = new Dog(); // 父类引用指向子类对象
        dog.shout(); // 输出 "汪汪....",多态表现
        Animal cat = new Cat(); // 父类引用指向子类对象
        cat.shout(); // 输出 "喵喵....",多态表现
    }
}
15.1.3 使用接口实现多态
interface Shape {
   
    void draw();
}

class Circle implements Shape {
   
    public void draw() {
   
        System.out.println("Drawing a circle");
    }
}
class Triangle implements Shape {
   
    public void draw() {
   
        System.out.println("Drawing a triangle");
    }
}

public class PolymorphismExample{
   
    public static void main(String[] args) {
   
       	Shape circel = new Circle();
		circel.draw(); // Output: "Drawing a circle"
        Shape triangle = new Triangle();
		triangle.draw(); // Output: "Drawing a triangle"
    }
}
15.1.4 父类形参接收子类实参
interface Shape {
   
    void draw();
}

class Circle implements Shape {
   
    public void draw() {
   
        System.out.println("Drawing a circle");
    }
}
class Triangle implements Shape {
   
    public void draw() {
   
        System.out.println("Drawing a triangle");
    }
}

class ShapeService(){
   
	// Shape shape是父类类型
	public void drawShape(Shape shape){
   
		shape.draw();
	}
}

public class PolymorphismExample{
   
    public static void main(String[] args) {
   
    	ShapeService shapeService = new ShapeService();
       	Circle circel = new Circle();
       	// 传递子类实参
       	shapeService.drawShape(circel); // Output: "Drawing a circle"
	    Triangle triangle = new Triangle();
	    // 传递子类实参
		shapeService.drawShape(triangle); // Output: "Drawing a triangle"
    }
}
  • 练习1
    • 定义墨盒接口InkBox,定义方法String getColor()用于获得墨盒颜色。
    • 定义纸张接口Paper, 定义方法String getSize()用于获得纸张大小。
    • 定义黑白墨盒类GrayInkBox实现InkBox接口,实现getColor方法,返回"黑白"。
    • 定义彩色墨盒类ColorInkBox实现InkBox接口,实现getColor方法,返回"彩色"。
    • 定义A4纸类A4Paper实现Paper接口,实现方法getSize,返回”A4“。
    • 定义B5纸类B5Paper实现Paper接口,实现方法getSize,返回”B5“。
    • 定义MyPrinter类,定义属性InkBox box,Paper paper,String brand,封装后定义方法work, 输出何种品牌打印机使用何种颜色墨盒在何种尺寸纸张上打印文字。
package task;
public interface InkBox {
   
  // 获得墨盒颜色
  String getColor();
}

package task;
public interface Paper {
   
  // 获得纸张尺寸
  String getSize();
}

package task;
public class A4Paper implements Paper {
   
  @Override
  public String getSize() {
   
    return "A4";
  }
}

package task;
public class B5Paper implements Paper {
   
  @Override
  public String getSize() {
   
    return "B5";
  }
}

package task;
public class ColorInkBox implements InkBox {
   
  @Override
  public String getColor() {
   
    return "彩色";
  }
}

package task;
public class GrayInkBox implements InkBox {
   
  @Override
  public String getColor() {
   
    return "黑色";
  }
}

package task;
public class MyPrinter {
   
  private InkBox box;
  private Paper paper;
  private String brand;

  public String getBrand() {
   
    return brand;
  }

  public void setBrand(String brand) {
   
    this.brand = brand;
  }

  public Paper getPaper() {
   
    return paper;
  }

  public void setPaper(Paper paper) {
   
    this.paper = paper;
  }

  public InkBox getBox() {
   
    return box;
  }

  public void setBox(InkBox box) {
   
    this.box = box;
  }

  public void work() {
   
    System.out.println(getBrand() + "打印机使用" + box.getColor() + "墨盒在" + paper.getSize() + "纸张上打印文字");
  }
}

package task;
public class MyPrinterTest {
   
  public static void main(String[] args) {
   
    MyPrinter myPrinter = new MyPrinter();
    // 彩色墨盒对象
    ColorInkBox colorInkBox = new ColorInkBox();
    myPrinter.setBox(colorInkBox);
    // 纸张对象
    A4Paper a4Paper = new A4Paper();
    myPrinter.setPaper(a4Paper);
    // 设置品牌
    myPrinter.setBrand("佳能");
    // 调用工作方法
    myPrinter.work(); // 佳能打印机使用彩色墨盒在A4纸张上打印文字

    // 另外一台打印机
    MyPrinter myPrinter1 = new MyPrinter();
    myPrinter1.setBrand("惠普");
    myPrinter1.setBox(new GrayInkBox());
    myPrinter1.setPaper(new B5Paper());
    myPrinter1.work(); // 惠普打印机使用黑色墨盒在B5纸张上打印文字
  }
}

15.2 对象类型转换

​ 对象类型转换注意分为以下两种情况:

​ 1. 向上转型: 子类对象 转换为 父类类型。

​ 2. 向下转型: 父类对象 转换为 子类类型。

​ 向上转型会自动完成,向下转型要强制转换。

15.2.1 向上转型
class Animal {
   
  public void shout() {
   
    System.out.println("Animal shout....");
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS配置JDK8环境并安装配置neo4j

1. 工具安装 1. 安装wget yum install -y wget2. 安装vim yum install -y vim-enhanced2. 配置JDK 1. 安装JDK 先到官网下载jdk8的压缩包,点我传送,并将压缩包上传到虚拟机的/usr/local目录下。 cd /usr/local # 进入 /usr/local目录 tar -zxvf jdk-…

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 654.最大二叉树 链接: 617.合并二叉树 链接: 700.二叉搜索树中的搜索 链接: 98.…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境: MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略,这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来,以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…

达梦工具使用-DTS

文章目录 前言一、图形化界面的DTS1.从Oracle迁移到DM2.从DM迁移到Oracle3.同构DM数据库迁移 二、命令行方式的DTS总结 前言 DTS是达梦数据库自带的数据迁移工具,主要场景适用于同构数据库轻量数据级之间数据迁移,当数据量不大时,也可用于不…

解决“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误方法

在计算机使用过程中,遇到诸如“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误提示并不罕见。这类问题往往会导致某些应用程序无法正常运行,给用户带来困扰。本文旨在详细阐述MSVCP120.dll文件的重要性、其丢失的可能原因,以及解决方法&a…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 一、简单介绍 二、简单进行车牌检测和识别实现原理 …

ACRN Intel推出的虚拟机是啥样的?

前言 ACRN作为Intel为工控领域推出的一个小型化的虚拟机,它的特点主要有这么几个: 1.针对Intel的芯片做了非常强的优化 2.RT-VM实时虚拟机的实时性很好 3.CACHE缓存技术发挥的好 4.TCC技术 / 当然不是所有intel的芯片都支持,&#xff0c…

OKCC搭建配置什么样的服务器合适

OKCC呼叫中心系统是一种采用软硬件结合的架构方式、及分布式的IP技术,从多角度为企业提供整合的一体化解决方案。因此,搭建OKCC呼叫中心系统所使用的服务器应该满足以下几点要求: 稳定性:服务器需要具有较高的稳定性和可靠性&…

应用部署tomcat的三种方式

由于一直在用springboot框架,集成了tomcat,快忘记如何单独部署tomcat了,以下,记录一下: 部署tomcat有三种方式: 一、方式一:将war包丢进webapps 这是最简单粗暴的方式:将web工程打…

平均月薪超4.6万!AI领域重磅课程汇总,哈佛,斯坦福,微软,谷歌等出品!

2023年底,由脉脉高聘人才智库发布的《2023泛人工智能人才洞察》报告显示,2023年前八个月内新发布的AI岗位平均月薪超过了4.6万元,而且人才供不应求,甚至出现了5个岗位争夺2个人才的情况。 本文章整理了10项来自全球各高校与知名企…

语音聊天app软件、语音房软件开发

最近我们收到了众多客户咨询,他们都对语音聊天app非常感兴趣! 语音聊天app,在线组CP,一起连麦聊天、唱歌、打游戏,年轻人非常喜欢的语音社交软件,可以语音通话、多人语音房聊天、发布动态、会员充值等功能.大家可以在虚拟世界里快乐社交! 里面还有好玩的互动小游戏,帮助客户增…

[Meachines][Easy]Bizness

Main $ nmap -p- 10.10.11.252 --min-rate 1000 $ dirsearch -u https://bizness.htb/ $ whatweb https://bizness.htb/control/login 存在一个未授权的RCE $ git clone https://github.com/jakabakos/Apache-OFBiz-Authentication-Bypass.git $ cd Apache-OFBiz-Authenticat…

【webrtc】m98 RoundRobinPacketQueue的优先级处理

m98 代码 PacedSender::EnqueuePackets 的调用者可能是多个地方,所以这个要加锁保护。RoundRobinPacketQueue 本身是没有锁的发现m98和新版本不同,参考:【webrtc】m114自己实现的PrioritizedPacketQueuepush和pop都是RtpPacketToSend 但是实际上,内部是封装为QueuedPacket 处…

【笔试强训】牛牛快递

链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/41b42e7b3c3547e3acf8e90c41d98270?tpId290&tqId39852&ru/exam/oj描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分…

基于RT-Thread的智能家居助手

一、项目简介 智能家居助手主要基于RT-Thread开发的,该系统主要分为语音子系统,环境监测子系统,智能控制子系统,智能网关子系统,音乐播放器,云端以及应用软件七大部分。语音子系统可通过语音进行人机交互来…

基于51单片机的温度、烟雾、防盗、GSM上报智能家居系统

基于51单片机的智能家居系统 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 1.DS18B20检测温度,MQ-2检测烟雾、ADC0832实现模数转换; 2.按键可以设置温度、烟雾浓度阈值&#x…

Linux加强篇-Shell命令脚本

目录 ⛳️推荐 编写Shell脚本 编写简单的脚本 接收用户的参数 判断用户的参数 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 编写Shell脚本 Shell脚本命令的工作方式有下面…

Hdu1350 Taxi Cab Scheme 【最小路径覆盖】

Taxi Cab Scheme 题意 有一张边长不超过 200 200 200 的网格图,有若干个乘客, 乘客 i i i 的需求是: h h : m m , ( a , b ) , ( c , d ) hh:mm, (a,b) , (c, d) hh:mm,(a,b),(c,d),意为他需要在 h h 时 m m 分 hh时mm分 hh时…

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具,与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0,所以kibana选择同样的7.12.0版本。 官网下载地址:https://www.elastic.co/cn/downloads/past-releas…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装,操作系…