动态多态——java

多态(Polymorphism)是面向对象编程(OOP)的一个核心概念,它允许一个接口被多个类实现,从而使得一个方法调用可以根据对象的实际类型表现出不同的行为。多态性提高了代码的灵活性和可扩展性。
多态的类型
编译时多态(静态多态):通过方法重载(Method Overloading)实现。
运行时多态(动态多态):通过方法重写(Method Overriding)和接口实现(Interface Implementation)实现。

本文讲述动态多态。
特点
方法重写:子类重写父类的方法,提供不同的实现。
向上转型:使用父类引用指向子类对象。
动态绑定:在运行时根据对象的实际类型调用相应的方法。

限制
多态只能通过父类或接口引用来调用方法,而不能调用子类特有的方法。
向上转型后,父类引用只能访问父类中定义的方法和属性。

案例 1

public class Parent {public String name = "父类成员变量";public void print(){System.out.println("父类方法");}public void say(){System.out.println("hello");}
}
public class Son extends Parent {public String name = "子类成员变量";@Overridepublic void print() {System.out.println("子类方法");}public void sing(){System.out.println("lalala");}
}public class Test {public static void main(String[] args) {Parent p = new Son();p.print();//子类方法System.out.println(p.name);//父类成员变量p.say();//hello//p.sing();报错if(p instanceof Son) {Son p2 = (Son) p;//通过强制类型转化p2.sing();//lalala}}
}

案例 2

public class Animal {public void say(){System.out.println("小动物会叫");}
}
public class Cat extends Animal{@Overridepublic void say() {System.out.println("喵喵~~~");}
}
public class Dog extends Animal {@Overridepublic void say() {System.out.println("汪汪~~~");}
}public class test {public static void main(String[] args) {print(new Cat());//喵喵~~~print(new Dog());//汪汪~~~}public static void print(Animal A){A.say();//当传入不同的对象会调用相应类的方法}
}

拓展
instanceof关键字
instanceof 用于检查对象是否是某个类或接口的实例,确保类型的安全性。
避免类型转换异常:在进行类型转换之前,使用 instanceof 可以确保转换是安全的。
null 检查:instanceof 对 null 对象返回 false。
继承层次结构:instanceof 可以检查对象在继承层次结构中的位置。

public class Main {public static void main(String[] args) {Animal myDog = new Dog();// 检查 myDog 是否是 Dog 类的实例if (myDog instanceof Dog) {System.out.println("myDog is an instance of Dog");} else {System.out.println("myDog is not an instance of Dog");}// 检查 myDog 是否是 Animal 类的实例if (myDog instanceof Animal) {System.out.println("myDog is an instance of Animal");}// 检查 myDog 是否是 Cat 类的实例if (myDog instanceof Cat) {System.out.println("myDog is an instance of Cat");} else {System.out.println("myDog is not an instance of Cat");}}
}
//myDog is an instance of Dog
//myDog is an instance of Animal
//myDog is not an instance of Cat
Dog myDog = null;
if (myDog instanceof Dog) {System.out.println("myDog is an instance of Dog");
} else {System.out.println("myDog is not an instance of Dog");
}
// 输出: myDog is not an instance of Dog

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

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

相关文章

机器学习中的预测:真的是预测吗?

预测 机器学习中的预测:真的是预测吗?预测的定义为什么预测需要X?传统预测与机器学习预测的对比未来的预测模型:向自动生成输入的方向发展结论 机器学习中的预测:真的是预测吗? 在探讨机器学习中的“预测”…

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中,资产属于核心地位,攻击方(红方)要尽可能的去获取对方资产,暴露目标资产,包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

宝塔SSL续签失败

我有2个网站a和b(文字中用baidu.com替换我的域名) b是要续签那个,但续签报错: nginx version: nginx/1.22.1 nginx: [emerg] host not found in upstream "github.com" in /www/server/panel/vhost/nginx/proxy/a.bai…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual ~Product() {}virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {st…

个人电脑网络安全 之 防浏览器和端口溢出攻击 和 权限对系统的重要性

防浏览器和端口溢出攻击 该如何防 很多人都不明白 我相信很多人只知道杀毒软件 却不知道网络防火墙 防火墙分两种 &#xff1a; 1、 病毒防火墙 也就是我们说的杀毒软件 2、 网络防火墙 这是用来防软件恶意通信的 使用防火墙 有两种 1、 半开式规则…

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法 ESP-01S模块 遇到问题首先按重要顺序及排除法来解决问题 1&#xff0c;你的USB转串口工具是否有问题&#xff1f; 请将TXD与RXD短接在一起进行测试&#xff0c;自收自发应该是正常的&#xff0c;请确保这点。 ESP-01S的串口…

ffmpeg ffplay.c 源码分析二:数据读取线程

本章主要是分析 数据读取线程read_thread 中的工作。如上图红色框框的部分 从ffplay框架分析我们可以看到&#xff0c;ffplay有专⻔的线程read_thread()读取数据&#xff0c; 且在调⽤av_read_frame 读取数据包之前需要做&#xff1a; 1.例如打开⽂件&#xff0c; 2.查找配置解…

[Java 后端面试题]2024-7-22

Redis的持久化机制,在真实的线上环境中需要采取什么样的策略 在真实的线上环境中&#xff0c;Redis的持久化机制主要有两种&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。每种机制都有其优点和适用场景&#xff0c;实…

Servlet 3.0的新特征

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServlet 3.0概述 Servlet 3.0规范是在2009年随着Java EE 6的发布而推出的。它引入了一系列新特性和改进,旨在简化Web应用的开发和部署过程,并提高Web应用的性能和可扩展性。Servlet 3.0的发布标…

ProGuard配置详解

ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器。它通过删除未使用的类、字段、方法和属性&#xff0c;优化字节码指令&#xff0c;并重命名类、字段和方法&#xff0c;使反编译后的代码难以理解&#xff0c;从而提高应用的安全性。以下是对ProGuard配置…

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

Git关联本地仓库和远程仓库

Step 1 添加远程仓库: git remote add <远程仓库别名><远程仓库地址> Step 2 git push -u <远程仓库名><分支名> 查看远程仓库: git remote -v 拉取远程仓库内容: 拉取服务器仓库过程中&#xff0c;如果本地和服务器有文件冲突&#xff0c;则会拉取失…

02 MySQL数据库管理

目录 1.数据库的结构 sql语言主要由以下几部分组成 2. 数据库与表的创建和管理 1&#xff0c;创建数据库 2&#xff0c;创建表并添加数据 3&#xff0c;添加一条数据 4&#xff0c;查询数据 5&#xff0c;更新数据 6&#xff0c;删除数据 3.用户权限管理 1.创建用户 …

js轮播图制作

实现一个简单的JavaScript轮播图可以通过以下步骤完成&#xff1a; 创建HTML结构&#xff0c;包括轮播图容器和图片列表。 使用CSS进行样式设置&#xff0c;包括隐藏多余的图片。 使用JavaScript编写函数来控制图片的切换。

wsl 下执行 systemctl 报错:Failed to get D-Bus connection: Operation not permitted

2024-07-21 01:31:47 补充 经过一系列查阅&#xff0c;关键词 wsl bad performance , 虚拟机启动慢可能是因为systemd 的启动项过多或耗时长。通过 dmesg 可以打印一些系统的启动信息&#xff0c;可以看到&#xff1a; [ 1.215065] systemd-journald[59]: Received reques…

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…

apache.commons.pool2 使用指南

apache.commons.pool2 使用指南 为什么要使用池 创建对象耗时较长&#xff0c;多线程频繁调用等因素限制了我们不能每次使用时都重新创建对象&#xff0c;使用池化思想将对象放进池内&#xff0c;不同线程使用同一个池来获取对象&#xff0c;极大的减少每次业务的调用时间。 …

Keepalived和Haproxy

Keepalived和Haproxy 一、Keepalived 1、keepalived概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址值在主上&#xff0c;主停止工作&#xff0c;vip飘移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;v…

C++——编译报重复定义错误的解决办法

原因&#xff1a; 头文件被多次编译。 解决办法&#xff1a; 找到包含头文件的地方&#xff0c;仔细检查。 比如&#xff1a; 这两句话是包含关系&#xff0c;写了第一句就不用第二句了。 因为&#xff1a;第一句是编译 tracker/detector/rknn_model_zoo/examples/yolov5/c…