java学习笔记8

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 {@Overridevoid speak() {System.out.println("Dog barks");}
}public class Cat extends Animal {@Overridevoid 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 {@Overridepublic String getSize() {return "A4";}
}package task;
public class B5Paper implements Paper {@Overridepublic String getSize() {return "B5";}
}package task;
public class ColorInkBox implements InkBox {@Overridepublic String getColor() {return "彩色";}
}package task;
public class GrayInkBox implements InkBox {@Overridepublic 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.mzph.cn/news/826114.shtml

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

相关文章

python爬虫-----深入了解 requests 库(第二十五天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

openAI tts Java文本转语音完整前后端代码 html

Java后端代码 maven 仓库&#xff1a; <!--openAI 请求工具--> <dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version>1.1.5</version> </dependency>maven 仓库官方 tts 使用案例…

浅析RED和EN 18031

文章目录 前言欧盟的法律文件什么是REDRED的发展EU 2022/30法规EU 2023/2444RED与EN 18031的关系 前言 提示&#xff1a;本文大致表述了欧盟的一些立法常识&#xff0c;RED的由来与发展&#xff0c;以及它跟EN 18031的关系 因为工作原因&#xff0c;最近稍微研究了一下欧盟即将…

微波炉定时器开关

微波炉火力调节开关及定时器开关内部结构 参考链接&#xff1a; 微波炉火力调节开关及定时器开关判断好坏小经验-百度经验 (baidu.com)https://jingyan.baidu.com/article/5d6edee2d175c399eadeecfd.html微波炉拆解图示&#xff0c;微波炉结构原理&#xff0c;轻松玩转微波炉维…

AI大模型探索之路-应用篇14:认识国产开源大模型GLM

目录 前言 一、国产主流大模型概览 1. 国内主流大模型清单 2. 主流大模型综合指数 3. 大语言模型评测榜单 二、GLM大模型介绍 三、GLM大模型发展历程 四、GLM家族之基座模型GLM-130B 五、GLM家族之ChatGLM3 六、GLM家族之WebGLM 七、GLM家族之CogVLM 1. CogVLM 2. …

春招冲刺百题计划|栈

Java基础复习 Java数组的声明与初始化Java ArrayListJava HashMapJava String 类Java LinkedListJava Deque继承LinkedListJava Set 第一题&#xff1a;有效的括号 很简单的题&#xff0c;从大一做到现在&#xff0c;就是复习一下语法。 class Solution {public boolean i…

系统架构最佳实践 -- 新能源汽车产业架构设计

随着环保意识的增强和能源结构的转型&#xff0c;新能源汽车产业正迅速崛起成为汽车行业的新宠。构建一个完善的新能源汽车产业架构对于推动产业发展、提升竞争力至关重要。本文将从设计原则、关键技术、产业生态等方面&#xff0c;探讨如何设计与实现新能源汽车产业架构。 新能…

LabVIEW专栏六、LabVIEW项目

一、梗概 项目&#xff1a;后缀是.lvproj&#xff0c;在实际开发的过程中&#xff0c;一般是要用LabVIEW中的项目来管理代码&#xff0c;也就是说相关的VI或者外部文件&#xff0c;都要放在项目中来管理。 在LabVIEW项目中&#xff0c;是一个互相依赖的整体&#xff0c;可以包…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

每日一题(L2-011):玩转二叉树--建树+层序遍历

与L2-006近乎相同&#xff0c;先建树&#xff0c;然后遍历 #include<bits/stdc.h> using namespace std; int in[35]; int pre[35]; typedef struct Tree{int num;Tree* left;Tree* right; }T;T * build(int in1,int in2,int pre1,int pre2){T * tnew T;t->numpre[pr…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来&#xff0c;对于参加考试的同学们来说&#xff0c;准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌&#xff0c;同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

LLM长度外推理论与实践

定义&#xff1a; 长度外推&#xff0c;即免训练长度外推&#xff0c;就是不需要用长序列数据进行额外的训练&#xff0c;只用短序列语料对模型进行训练&#xff0c;就可以得到一个能够处理和预测长序列的模型&#xff0c;即“Train Short, Test Long”。 判断方法&#xff1…

【论文源码实战】轻量化MobileSAM,分割一切大模型出现,模型缩小60倍,速度提高40倍

前言 MobileSAM模型是在2023年发布的&#xff0c;其对之前的SAM分割一切大模型进行了轻量化的优化处理&#xff0c;模型整体体积缩小了60倍&#xff0c;运行速度提高40倍&#xff0c;但分割效果却依旧很好。 MobileSAM在使用方法上沿用了SAM模型的接口&#xff0c;因此可以与…

Java对象克隆-浅拷贝与深拷贝

目录 1、对象的克隆 1.1 对象的浅拷贝 1.2 对象深拷贝 1、对象的克隆 1.1 对象的浅拷贝 在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能会需要一个和A完全相同新对象B&am…

论婚恋相亲交友软件的市场前景和开发方案H5小程序APP源码

随着移动互联网的快速发展和社交需求的日益增长&#xff0c;婚恋相亲交友软件小程序成为了越来越多单身人士的选择。本文将从市场前景、使用人群、盈利模式以及竞品分析等多个角度&#xff0c;综合论述这一领域的现状与发展趋势。 一、市场前景 在快节奏的现代生活中&#xf…

得物sign参数逆向分析与Python算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. Python算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚…

Postman调用OpenApi接口

首先你需要科学上网。。。。。 请求方式&#xff1a;post 请求地址&#xff1a;https://api.openai.com/v1/chat/completions 请求头&#xff1a; Authorization : Bearer key Content-Type : application/json Body : { "messages": [{ "role": &quo…

【论文精读】Bag of Tricks for Image Classification with Convolutional Neural Networks

这篇文章比较早了&#xff0c;2018年的 摘要 最近在图像分类研究方面取得的大部分进展可以归功于训练程序的改进&#xff0c;如数据增强和优化方法的改变。然而&#xff0c;在文献中&#xff0c;大多数改进要么作为实现细节简要提到&#xff0c;要么只在源代码中可见。在本文中…

CV method:最新Backbone---TransNeXt

文章目录 前言一、提出问题二、模型结构1. Pixel-focused Attention&#xff08;像素聚焦注意力机制&#xff09;2. Aggregating Diverse Attentions in a Single Mixer Query embedding3. ConvGLU4. 整体模型架构 三、方法论1. PFA设计原理2. Aggregating Diverse Attention原…

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架&#xff1f;二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli&#xff0c;并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…