Java面向对象——多态、Object类、instanceof关键字以及final关键字

多态的概念

1.多态是指同一个方法调用可以在不同的对象上有不同的表现,即同一种方法调用方式适用于不同的数据类型。
编译时和运行时:
	编译时期调用的是父类中的方法,但运行时期会根据实际的对象类型来调用适当的方法。
	这种行为称为动态绑定,即运行时决定调用哪个方法。
2.接口也可以实现多态性。
3.实现多态的条件:
	继承关系、方法重写,以及父类引用指向子类对象是实现多态性的关键条件。
4.父类引用指向子类对象:
	可以使用父类的引用来指向子类的对象,这样就可以通过统一的接口来调用不同子类的方法。
	子类继承父类,并且子类重写父类的方法。
	此处,需要注意的是如果向上转型后,父类需要调用子类新增的方法,
可以通过向下转型的方法【即把父类转换为子类实现】
4.1向上转型:
	将子类的对象赋值给父类的引用称为向上转型。这种转型不需要显式地进行,编译器会自动进行类型检查。
4.2向下转型:
	将父类的引用转为子类的引用称为向下转型。需要使用强制类型转换,但在进行之前最好使用 instanceof 进行类型检查,以避免异常。
**口诀:【调用实例方法看等号==右边】【调用静态方法看等号==左边】**

总之,多态是面向对象编程中一个非常重要的概念,通过它可以实现统一的接口来操作不同的对象,提高代码的可读性和可维护性。在实际编程中,多态性的使用可以使代码更加灵活和扩展性更强。方法重写是实现多态的基础。
在这里插入图片描述

instanceof关键字的介绍

instanceof 用于在运行时检查一个对象是否是特定类的实例,或者是否实现了特定接口。
1. 判断对象是否是特定类的实例:
2. 判断对象是否实现了特定接口:
3. 多层次继承中的判断: instanceof 也可以在多层次继承关系中使用。
4. 避免滥用 instanceof: 虽然 instanceof 可以用于类型检查。但在面向对象的设计中,通常应该倾向于使用多态和继承来避免大量的 instanceof 检查。
5. 使用 instanceof 与类型转换: instanceof 可以与类型转换(强制类型转换)一起使用,以确保转换的安全性。

final关键字

1. final 变量: 用于声明一个常量,一旦赋值后就不能再修改。
2. final 方法: 用于阻止子类对该方法的重写(覆盖)。
3. final 类: 用于表示一个类不能被继承。
4. final 参数: 用于表示方法参数在方法内不能被修改。
5. final 引用: 用于表示引用指向的对象不能被修改,但对象本身的属性可以被修改(对于非基本类型)。
6. final 静态变量: 用于表示一个静态变量是一个常量,通常用大写命名。
7. final 数组: 用于表示数组引用不可更改,但数组内的元素可以更改。

Object类

1. equals(Object obj) 方法:
	用于比较两个对象是否相等。默认情况下,它比较的是对象的引用,但你可以在你的类中重写这个方法以自定义比较逻辑。
2. hashCode() 方法:
	返回对象的哈希码值。在使用集合(如哈希表)时,哈希码用于确定对象在内存中的存储位置。
3. toString() 方法:
	返回对象的字符串表示。默认情况下,这是对象的类名 + @ + 对象的哈希码。你可以在你的类中重写这个方法,以便自定义字符串表示。
4. getClass() 方法:
	返回对象所属的类的 Class 对象。Class 对象提供了有关类的信息,包括类名、方法、字段等。
5. wait(), notify() 和 notifyAll() 方法:
	用于在多线程环境下进行线程通信。这些方法只能在同步代码块中使用,用于唤醒等待中的线程。而且通常与锁机制一起使用。
6. wait() 方法:
	用于在线程之间进行等待,直到其他线程唤醒它。也需要在同步代码块中使用。
7. finalize() 方法:
	通常不建议使用,因为 Java 中的垃圾回收机制会自动释放对象占用的资源。
	由垃圾回收器在回收对象之前调用。通常不建议使用,因为不同的 JVM 行为可能不同。
8. clone() 方法:
	用于创建并返回对象的副本。需要注意的是,这个方法的默认实现是浅拷贝,即对象内部的引用也会被共享。
关于equals方法的重写:
	/**
 * 重写 equals 要求:
 * 对 null 返回 false
 * 自反性:x.equals(x) 返回true
 * 对称性: x.equals(y) 的值 和 y.equals(x) 的值一样
 * 传递性: x.equals(y) 为 true, y.equals(z) 为 true, 此时 x.equals(z) 为 true
 * 一致性: x.equals(y) 多次调用结果一致
 *  重写了 equals 就要重写 hashCode    
 *  */ 

重写如下所示

@Override
    public boolean equals(Object obj) {
        // this【当前对象】   obj【需要比较的对象】
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        // 学生是同一个对象要求是 学号一样就是同一个
        // 类型转换, 有继承关系 向上转型 和 向下转型
        // Student --> Object  向上转型
//        Object o = this;

        // Object --> student 向下转型 强制类型转换

        Student stu = (Student) obj;

        if (stu.id == this.id || stu.id.equals(this.id)) {
            return true;
        }
        return false;
    }

关于hashCode方法的重写:

 /*
        equals 结果为 true hashCode 值一样
        hashCode 一样 equals 结果不一定
     */
    @Override
    public int hashCode() {
       int result = 1;
       result = 31 * result + name.hashCode();
       result = 31 * result + age;
       result = 31 * result + gender;
       result = 31 * result + id.hashCode();

       return result;
    }

重写toString方法:

@Override
  public String toString() {
      return "Student{" +
              "name='" + name + '\'' +
              ", age=" + age +
              ", gender=" + gender +
              '}';
  }

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

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

相关文章

【已解决】记 Vue3+SpringBoot 前后端分离项目部署时的一次跨域问题

问题背景是在一次部署开发环境时,由于是前后端分离项目(前端Vue3,后端SpringBoot),SpringBoot 使用 Docker 部署,前端访问服务接口时出现跨域问题。 不知道什么是跨域问题的小伙伴可以查看另一篇文章&…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案

一,什么是缓存穿透、雪崩、击穿? 1、缓存穿透: 是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后…

CSS 选择器

前言 基础选择器 以下是几种常见的基础选择器。 标签选择器&#xff1a;通过HTML标签名称选择元素。 例如&#xff1a; p {color: red; } 上述样式规则将选择所有<p>标签 &#xff0c;并将其文字颜色设置为红色。 类选择器&#xff1a;通过类名选择元素。使用类选择…

docker cURL error 6: Could not resolve host

场景&#xff1a; 微信小程序 获取 用户 openpid&#xff0c;在此之前&#xff0c;我需要先 "获取稳定版接口调用凭据"&#xff0c;根据手册提示的&#xff0c;要先调用 https://api.weixin.qq.com/cgi-bin/stable_token 我这边就开始了请求&#xff0c;结果返回了…

函数性能探测:更简单高效的 Serverless 规格选型方案

作者&#xff1a;拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮&#xff0c;以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…

Flink的常用算子以及实例

1.map 特性&#xff1a;接收一个数据&#xff0c;经过处理之后&#xff0c;就返回一个数据 1.1. 源码分析 我们来看看map的源码 map需要接收一个MapFunction<T,R>的对象&#xff0c;其中泛型T表示传入的数据类型&#xff0c;R表示经过处理之后输出的数据类型我们继续往…

在ARM服务器上一键安装Proxmox VE(以在Oracle Cloud VPS上为例)(甲骨文)

前言 如题&#xff0c;具体用到的说明文档如下 virt.spiritlhl.net 具体流程 首先是按照说明&#xff0c;先得看看自己的服务器符不符合安装 Proxmox VE的条件 https://virt.spiritlhl.net/guide/pve_precheck.html#%E5%90%84%E7%A7%8D%E8%A6%81%E6%B1%82 有提到硬件和软…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题&#xff1f; 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染&#xff08;或满了&#xff09; 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案&#xff1a;队列重试机制 6.3 方案&#xff1a;异步更新缓…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

day20 飞机大战射击游戏

有飞行物类 飞行 爆炸 的连环画&#xff0c; 飞行的背景图 &#xff0c; 子弹图&#xff0c; 还有游戏开始 暂停 结束 的画面图。 设计一个飞机大战的小游戏&#xff0c; 玩家用鼠标操作hero飞行机&#xff0c; 射出子弹杀死敌机&#xff0c;小蜜蜂。 敌机可以获得分数&…

浅谈java自定义中类两个对象的比较

目录 实现比较两个对象是否相同 1.前置代码 1.学生类 2.示例 3.输出 4.原因 2.那么我们要怎么做呢? 1.对Student类中重新实现quals方法(即对equals方法重写) 2.完整代码如下: 3.具体操作 4.演示 1.示例 2.输出 3.原因 实现比较两个对象的大小 第一种: 用…

Android 9.0 Vold挂载流程解析(下)

Android 9.0 Vold挂载流程解析&#xff08;上&#xff09; 前言 上一篇介绍了Android 文件系统中Vold挂载机制的总体框架&#xff0c;我们分析了vod进程的main.cpp.接下来我们分析下存储卡挂载和卸载的流程。 存储卡挂载 在上篇文章文章提到&#xff0c;监听驱动层挂载和卸…

【是C++,不是C艹】 手把手带你实现Date类(附源码)

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 恍惚间&#xff0c;已经两个月没更新了 &#xff08;&#xff1b;д&#xff40;&#xff09;ゞ 我忏…

听GPT 讲Alertmanager源代码--dispatch/silence/inhibit等

目前Alertmanager项目共计53M大小&#xff0c;其中.git占了46M&#xff0c;总的go代码行数不足6万行(包括.pb.go等文件)&#xff0c;不算是一个大项目。 但实现了告警的分发&#xff0c;静默等功能&#xff0c;值的研究&#xff0c;尤其是dispatch中的route部分。 在Prometheus…

2022年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;和数 给定一个正整数序列&#xff0c;判断其中有多少个数&#xff0c;等于数列中其他两个数的和。 比如&#xff0c;对于数列1 2 3 4, 这个问题的答案就是2, 因为3 2 1, 4 1 3。 时间限制&#xff1a;10000 内存限制&#xff1a;65536 输入 共两行&#x…

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性

验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输…

关于lattice planner

使用编程创建驾驶场景。 1.使用Driving scenario Designer 交互方式创建驾驶场景 2.导出matalb function 3.修正这个函数&#xff0c;创建原始场景的变体。 4.调用这个函数&#xff0c;生成drivingScenario object。 5.在simulink中仿真&#xff0c;导入这个objcet &…

探索线程池的威力:优化多线程任务管理与性能提升

比喻举例&#xff08;可以比作工人队伍&#xff09; 想象一下&#xff0c;如果我们需要完成很多工作&#xff0c;我们可以招募一群工人来协助。然而&#xff0c;如果每个工人都是临时招募的&#xff0c;工作完成后就解雇他们&#xff0c;那么每次都要花时间和精力来招募和解雇工…

蓝桥杯上岸每日N题 (闯关)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…