Java 多态/向下转型/instanceof

1. 多态
1.1 概述

多态:事务的不同形态,如 动物,其有多种形态:猫,狗之类的;

1.2 使用方法

虚拟方法(父类被重写的方法在多态中叫做虚拟方法)调用:

父类引用指向子类对象(子类对象赋给父类引用),

即 ” 编译看左边,执行看右边“;

以下是虚拟方法与正常方法的简单对比:

正常方法:

Animal a = new Animal ();

虚拟方法:

Animal a = new Dog;

1.3 使用前提

1. 面向对象的继承性;

2. 重写父类方法;

3. 对象的多态性只适用于方法,不适用于属性,可认为属性没有被重写;

以下是关于动物,猫与狗三类结合多态性的案例:

/**动物类*/
public class Animal {int age;public Animal(){};public void eat(){System.out.println("动物需要补充能量。");}public void sleep(){System.out.println("动物需要睡觉。");}
}
/**狗狗类*/
class Dog extends Animal{@Overridepublic void eat(){System.out.println("狗爱吃骨头!");}@Overridepublic void sleep(){System.out.println("狗闭着眼睛睡觉!");}public void type(){System.out.println("汪星人最可爱的啦!");}
}
/**猫猫类*/
class Cat extends Animal{@Overridepublic void eat(){System.out.println("猫爱吃鱼!");}@Overridepublic void sleep(){System.out.println("猫躺着睡觉!");}public void type(){System.out.println("猫猫也很可爱的啦!");}
}
class AnimalTest{public static void main(String[] args) {
//        创建动物的对象Animal an = new Animal();an.eat();an.sleep();
//        创建狗狗的对象Dog d = new Dog();d.eat();d.sleep();System.out.println("=====================");
//        多态:事物的不同形态;如 动物 可以是 猫,可以是 狗,也可以是其他Animal a = new Dog();
//        使用:1. 父类引用指向子类对象(子类对象赋给父类引用)
//              2. 编译看左边,eat/sleep 方法父类中创建过,
//                 执行看右边:但执行的是子类重写的方法;a.eat();a.sleep();
//        报错:type 是子类独有的,不符合 “编译在左边”,不符多态的使用,因此会报错
//        a.type();}
}
2. 多态的体现

简而言之,多态的使用体现在将子类对象赋给父类,

通过形参为父类,使用匿名对象的方法,避免为多个对象重载,

进而调用不同子类的重写方法,实现不同的功能,

以此降低代码的冗余,提高代码的复用性;

public class multipleTypePeople {private String name;private int age;
//    构造方法public multipleTypePeople(){}public multipleTypePeople(String name,int age){this.age = age;this.name = name;}
//    set/get 方法public void setName(String name){this.name = name;}public String getName(){return name;}public void setAge(int age){this.age = age;}public int getAge(){return age;}
//    方法public void eat(){System.out.println("吃饭长身体!");}public void sleep(){System.out.println("睡眠不足有害身体健康!");}
}
class teacher extends multipleTypePeople{@Overridepublic void eat(){System.out.println("教师也很累!");}@Overridepublic void sleep(){System.out.println("教师睡眠不足!");}
}
class Student extends multipleTypePeople{@Overridepublic void eat(){System.out.println(" 学生也累啊!");}@Overridepublic void sleep(){System.out.println("学业压力也很大!");}
}
class mulTest{public static void main(String[] args) {
//        multipleTypePeople mt = new teacher();mulTest mt = new mulTest();mt.func(new teacher());//mulTest mt = new teacher();mt.func(new Student());//mulTest mt = new student();// 避免为多个对象重载,降低代码的冗余,提高代码的复用性
//        System.out.println("=======================");
//        teacher t = new teacher();
//        t.eat();
//        t.sleep();
//        System.out.println("=======================");
//        Student s = new Student();
//        s.eat();
//        s.sleep();}public void func(multipleTypePeople mt){//形参为父类,使用匿名对象的方法mt.eat();mt.sleep();}
}

 

3. 向下类型转换

以上多态的使用,均属于向上类型转换:

如 Animal a = new Dog ;

将范围小的 Dog 类赋值给 范围大的 Aniaml 类;

3.1 作用

解决无法调用子类特有的方法或属性的问题

情景:如下动物类,狗类以及测试类。

通过子类对象赋给父类引用,

发现无法通过对象调用子类特有的属性和方法;

因为有了对象的多态性之后,内存虽然加载了子类的结构,

但对象声明为父类类型,只能调用父类的属性和子类的重写方法,

无法调用子类特有的的结构;

class reAnimal {int age;public reAnimal(){};public void eat(){System.out.println("动物需要补充能量。");}public void sleep(){System.out.println("动物需要睡觉。");}
}
class reDog extends reAnimal{//    特有的属性public String name;@Overridepublic void eat(){System.out.println("狗爱吃骨头!");}@Overridepublic void sleep(){System.out.println("狗闭着眼睛睡觉!");}//    特有的方法public void type(){System.out.println("汪星人最可爱的啦!");}public void color(String color){System.out.println("狗狗的颜色是" + color);}
}
class reAnimalTest{public static void main(String[] args) {reAnimal ra = new reDog();
//      无法调用子类特有的方法或属性;因为编译时,rat 是 reAnimal 类,只能调用父类的结构ra.name = "团子";ra.color("黄色");}
}

3.2 格式

子类 子类对象 = ( 子类 )父类对象

理解:

赋值运算符两边数据类型要么相同,

要么右边数据类型可以自动上升为左边,

显然,向下类型转换不能完成,

因此使用 ( ),实现强制转换;

4. instanceof 关键字
4.1 引入

使用向下类型转换需要强制类型转换,

强制类型转换总伴随缺点,

对其他子类再实现向下类型转换

就会出现异常;

如下:对狗向下类型转换之后,再对猫实现向下类型转换,就会发生异常;

class reAnimal {int age;public reAnimal(){};public void eat(){System.out.println("动物需要补充能量。");}public void sleep(){System.out.println("动物需要睡觉。");}
}
class reCat extends reAnimal{@Overridepublic void eat(){System.out.println("猫爱吃鱼!");}@Overridepublic void sleep(){System.out.println("猫躺着睡觉!");}public void type(){System.out.println("猫猫也很可爱的啦!");}
}
class reDog extends reAnimal{//    特有的属性public String name;@Overridepublic void eat(){System.out.println("狗爱吃骨头!");}@Overridepublic void sleep(){System.out.println("狗闭着眼睛睡觉!");}//    特有的方法public void type(){System.out.println("汪星人最可爱的啦!");}public void color(String color){System.out.println("狗狗的颜色是" + color);}
}
class reAnimalTest{public static void main(String[] args) {reAnimal ra = new reDog();
//      可以调用父类的属性ra.age = 12;
//       向下类型转换reDog rd = (reDog) ra;rd.name = "大黄";rd.color("黄色");
//        缺点:可能出现异常reCat rc = (reCat) ra;rc.eat();}
}

4.2  作用

为避免向下转型出现异常,

在向下转型之前,

常用 instanceof 判断,

结果为 true ,进行向下转型;

结果 为 false , 不进行向下转型;

5. 练习

public class GeoTest {protected String color;protected double weight;protected GeoTest(){}protected GeoTest(String color){this.color = color;this.weight = weight;}public void setColor(String color){this.color = color;}public String getColor(){return color;}public void setWeight(double weight){this.weight = weight;}public double getWeight(){return weight;}public double findArea(){return 0;}
}class Circle extends GeoTest{private double radius;public Circle(){}public Circle(String color,double radius){super(color);this.radius = radius;}public void setRadius(double radius){this.radius = radius;}public double getRadius(){return radius;}@Overridepublic double findArea(){return Math.PI*radius*radius;}
}class MyRectangle extends GeoTest{private double width;private double height;public MyRectangle(){}public MyRectangle(String color,double width,double height){super(color);this.width = width;this.height = height;}public void setWidth(double width){this.width = width;}public double getWidth(){return width;}public void setHeight(double height){this.height = height;}public double getHeight(){return height;}@Overridepublic double findArea(){return width * height;}
}
class GeomeTest{public static void main(String[] args) {GeomeTest get = new GeomeTest();MyRectangle mt = new MyRectangle("白色",10,10);Circle cl = new Circle("紫色",12);get.equalArea(cl,mt);//GeoTest gt1 = new MyRectangle,GeoTest gt2 = new Circleget.displayGeomeArea(cl);//GeoTest gt = new Circleget.displayGeomeArea(mt);//GeoTest gt = new MyRectangle}public void equalArea(GeoTest gt1,GeoTest gt2){System.out.println(gt1.findArea() == gt2.findArea());}public void displayGeomeArea(GeoTest gt){System.out.println(gt.findArea());}
}

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

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

相关文章

【Maven】resources-plugin

在使用maven的项目中,它默认加载的是resources目录下的资源文件,像properties、xml 这类资源文件,但有时候可能会定义在java 源码目录下,这时候运行项目就会报找不到资源文件的错误 来到classpath 下,发现没有这个xsd…

我的创作纪念日——我与CSDN一起走过的365天

目录 一、机缘:旅程的开始 二、收获:沿路的花朵 三、日常:不断前行中 四、成就:一点小确幸 五、憧憬:梦中的重点 一、机缘:旅程的开始 最开始开始写博客是在今年一二月份的时候,也就是上一…

Restormer: Efficient Transformer for High-Resolution Image Restoration解读

论文地址:Restormer: Efficient Transformer for High-Resolution Image Restoration。 摘要 由于卷积神经网络(CNN)在从大规模数据中学习可推广的图像先验方面表现出色,这些模型已被广泛应用于图像复原及相关任务。近年来&…

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址:www.hw.com/api/upload转发地址:http://…

RavenMarket:用AI和区块链重塑预测市场

不论是美股市场还是加密市场,AI都是本轮周期里的最大叙事。本轮AI的最大受益者英伟达市值超越苹果一跃成为全球第一大公司,加密领域围绕着AI的创新也是层出不穷,很多项目方开始向着AI转型。 而近期币圈最热门的板块就是AI agent,…

如何将自己本地项目开源到github上?

环境: LLMB项目 问题描述: 如何将自己本地项目开源到github上? 解决方案: 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置,并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…

【数学建模美赛速成系列】O奖论文绘图复现代码

文章目录 引言折线图 带误差棒得折线图单个带误差棒得折线图立体饼图完整复现代码 引言 美赛的绘图是非常重要得,这篇文章给大家分享我自己复现2024年美赛O奖优秀论文得代码,基于Matalab来实现,可以直接运行出图。 折线图 % MATLAB 官方整理…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

通过内核模块按fd强制tcp的quickack方法

一、背景 tcp的quickack功能是为了让ack迅速回发,快速响应,减少网络通讯时延,属于一个优化项,但是tcp的quickack是有配额限制的,配置是16个quick,也就是短时间内quickack了16次以后,这个配额为…

大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》

摘要 预训练的大语言模型(LLMs)近年来在自主网页自动化方面实现了更好的泛化能力和样本效率。然而,在真实世界的网站上,其性能仍然受到以下问题的影响:(1) 开放领域的复杂性,(2) 有限的上下文长度&#xff…

C++实现Point2D类 有限元基础类

基础类表示的是在有限元计算过程中必要通用的类。 1、Point2D 表示的是二维节点,是组成二维有限元单元的节点。 1.1、public function 1.1.1、构造函数与析构函数 构造函数用来初始化point2D的基本信息,析构函数用来释放内存 Point2D.h声明函数 //…

51c自动驾驶~合集48

我自己的原文哦~ https://blog.51cto.com/whaosoft/13133866 #UDMC 考虑轨迹预测的统一决策控制框架 论文:https://arxiv.org/pdf/2501.02530 代码:​​https://github.com/henryhcliu/udmc_carla.git​​ 1. 摘要 当前的自动驾驶系统常常在确…

LeetCode hot 力扣热题100 排序链表

归并忘了 直接抄! class Solution { // 定义一个 Solution 类,包含链表排序的相关方法。// 使用快慢指针找到链表的中间节点,并断开链表为两部分ListNode* middleNode(ListNode* head) { ListNode* slow head; // 慢指针 slow 初始化为链表…

ChromeOS 132 版本更新

ChromeOS 132 版本更新 1. 企业定制化 Chrome Web Store 管理员现在可以使用新设置定制 Chrome Web Store 以适应他们管理的用户,包括以下功能: 添加公司标志添加首页横幅和自定义公告策划扩展集合实施基于类别的控制 这些设置可以通过管理员控制台进…

力扣动态规划-5【算法学习day.99】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…

国内汽车法规政策标准解读:GB 44495-2024《汽车整车信息安全技术要求》

目录 背景 概述 标准适用范围 汽车信息安全管理体系要求(第5章) 信息安全基本要求(第6章) 信息安全技术要求(第7章) ◆ 外部连接安全要求: ◆通信安全要求: ◆软件升级安全…

Apache SeaTunnel 2.3.9 正式发布:多项新特性与优化全面提升数据集成能力

近日,Apache SeaTunnel 社区正式发布了最新版本 2.3.9。本次更新新增了Helm 集群部署、Transform 支持多表、Zeta新API、表结构转换、任务提交队列、分库分表合并、列转多行 等多个功能更新! 作为一款开源、分布式的数据集成平台,本次版本通过…

EasyControl:首个登陆AWS Marketplace的中国MDM先锋

在全球数字化与移动化浪潮中,企业对安全、高效的移动设备管理(MDM)需求日益增长。EasyControl作为国内MDM领域的佼佼者,凭借成熟的技术和创新的解决方案,成为国内首个成功上线亚马逊AWS Marketplace的MDM产品&#xff…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录: 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)&#xff…