第七周学习笔记DAY.4-方法重写与多态

news2024/11/16 16:42:51

学完本次课程后,你能够:

 实现方法重写 深入理解继承相关概念

了解Object类

会使用重写实现多态机制

会使用instanceof运算符

会使用向上转型

会使用向下转型

什么是方法重写

方法的重写或方法的覆盖(overriding)

1.子类根据需求对从父类继承的方法进行重新编写

2.重写时,可以用super.方法的方式来保留父类的方法

3.构造方法不能被重写

方法重写规则

方法名相同

参数列表相同

返回值类型相同或者是其子类

访问权限不能严于父类

父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法

子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)

父类的私有方法不能被子类覆盖

不能抛出比父类方法更多的异常

方法重写vs方法重载

Object类

Object类是所有类的父类
Object类被子类经常重写的方法

Object类的equals()方法

1.比较两个对象是否是同一个对象,是则返回true

2.操作符==

    简单数据类型,直接比较值。如1==2

    引用类型,比较两者是否为同一对象

(1)Object类的equals()方法与==没区别

(2)当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()

(3)Java.lang.String重写了equals()方法,把equals()方法的判断变为了判断其值

instanceof用于判断一个引用类型所引用的对象是否是一个类的实例

为什么使用多态

频繁修改代码,代码可扩展性、可维护性差

使用多态优化

同一种事物,由于条件不同,产生的结果也不同

多态:同一个引用类型,使用不同的实例而执行不同操作

方法重写是实现多态的基础

抽象方法

抽象方法没有方法体

抽象方法必须在抽象类里

抽象方法必须在子类中被实现,除非子类是抽象类

向上转型

向上转型:父类的引用指向子类对象,自动进行类型转换

//测试方法

    Pet pet = new Dog();

    pet.setHealth(20);

    Master master = new Master();

    master.cure(pet);

 <父类型> <引用变量名> = new <子类型>();

此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法

此时通过父类引用变量无法调用子类特有的方法

向下转型

向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换

如果需要子类特有的方法,怎么办?

Dog dog=(Dog)pet;//将pet 转换为Dog类型

dog. catchingFlyDisc();//执行Dog特有的方法

<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;

在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常

instanceof

如何减少在向下转型的过程中,没有转换为真实子类类型的类型转换异常?

Java中提供了instanceof运算符来进行类型的判断

使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系

多态的应用

使用父类作为方法的形参,是Java中实现和使用多态的主要方式

使用父类作为方法的返回值,也是Java中实现和使用多态的主要方式

当父类方法不足以满足子类需求时,在子类中可以对父类中的方法进行重写,方法重写有如下规则:
 1)在子类中重写
 2)重写方法与父类方法方法名相同
 3)重写方法参数列表与父类方法参数列表相同
 4)重写方法的返回值类型和父类方法返回值类型相同或者其子类
 5)重写方法的访问修饰符不能严于父类方法的访问修饰符

@Override 注解,说明该方法是重写的方法

友情提醒:
 一个对象在调用方法的时候,先从自己类中查找,如果有就调用自己类中的方法
 如果自己类中没有找到调用的方法,就找父类,父类有就调用父类中的方法,如果父类没有,继续往上找父类的父类....直到找到Object类中
 如果Object类中没有你要调用的方法,那就报错

Object类中的equals()方法比较的是两个对象的内存地址值,因为查看equals()方法底层代码得知,其方法体内部是使用==比较两个对象
 ==比较基本数据类型中的数值,也可以比较引用数据类型,比较引用数据类型时,比较的是引用数据类型在内存中的地址值

toString()方法是Object类中的一个,以字符串的形式返回对象在内存中的地址值,格式如下:
 getClass().getName() + "@" + Integer.toHexString(hashCode())

多态:同一个父类引用,指向不同的子类实例,实现的操作不同(实现操作不同的前提是在子类中对父类的方法进行了重写)

通过父类引用调用方法,从代码表面上看是调用父类中的方法,实际上调用的是指向的子类中重写后的方法

向下转型过程中有可能出现异常,将父类引用指向的对象没有转换为其真实的子类对象,会报ClassCastException(类型转换异常)

为了避免在向下转型过程中出现类型转换异常,所以在转型前先对父类引用指向的子类进行判断,判断父类引用指向的是哪一个子类实例,这个使用instanceof运算符实现
父类引用 instanceof 子类类名:如果父类引用执行的是你指定的子类,返回true,否则返回false

抽象类:使用abstract修饰的类为抽象类


 1)抽象类的定义与前面定义普通类是一样的,可以定义属性、构造方法、get/set方法、重写toString()方法、其他普通方法
 2)抽象类中可以定义抽象方法,也可以不定义抽象方法
 3)抽象类一般用于定义父类,所以在子类中必须重写父类中所有的抽象方法,如果不重写,那么子类也要定义为抽象类
 4)抽象类不能直接通过new的形式来实例化,可以通过多态的形式来创建其引用
 抽象类类名 引用名= new 子类();

输出属性信息


 既然在多态中,父类引用调用给的方法实际上是指向的子类中重写后的方法,那么在父类中定义的方法可以不定义方法体,将方法定义为抽象方法

 抽象方法:使用abstract修饰的方法为抽象方法
 1)抽象方法没有方法体
 2)抽象方法所在的类要定义为抽象类

多态的应用:
 1)使用父类作为方法的形参,是Java中实现和使用多态的主要方式
 2)使用父类作为方法的返回值,也是Java中实现和使用多态的主要方式

NullPointerException:空指针异常,当使用一个null对象调用方法时,会报空指针异常

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

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

相关文章

【STM32CubeIDE 1.15.0】汉化包带路径配置过程

一、IDE软件下载 二、汉化版包路径 三、IDE软件板载汉化包 一、IDE软件下载 ST官网IDE下载链接 二、汉化版包路径 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 找不到就到.cn后面一级一级进 三、IDE软件板载汉化包 https://mirrors.ustc.edu…

Jmeter 压测-Jprofiler定位接口相应时间长

1、环境准备 执行压测脚本&#xff0c;分析该接口tps很低&#xff0c;响应时间很长 高频接口在100ms以内&#xff0c;普通接口在200ms以内 2、JProfiler分析响应时间长的方法 ①JProfiler录制数据 压测脚本&#xff0c;执行1-3分钟即可 ②分析接口相应时间长的方法 通过Me…

Django之rest_framework(四)

扩展的视图类介绍 rest_framework提供了几种后端视图(对数据资源进行增删改查)处理流程的实现,如果需要编写的视图属于这几种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量 官网:3 - Class based views - Django REST framework rest_framework.mixi…

cobaltstrike 流量隐藏

云函数 新建一个云函数&#xff0c;在代码位置进行修改 首先导入 yisiwei.zip 的云函数包 PYTHON # -*- coding: utf8 -*- import json, requests, base64def main_handler(event, context):C2 https://49.xx.xx.xx # 这里可以使用 HTTP、HTTPS~下角标~ path event[path]h…

在Windows 11/10/8中打开计算机管理的几种方法,总有一种适合你

序言 计算机管理是Windows中一个功能强大的工具,允许你管理和监视计算机系统的各个方面。使用“计算机管理”,你可以快速访问“设备管理器”、“磁盘管理”、“本地用户管理”等。本文将向你展示如何在Windows 11/10/8中打开“计算机管理器”。 网上有很多方法可以打开计算…

Spring Security详细学习第一篇

Spring Security 前言Spring Security入门编辑Spring Security底层原理UserDetailsService接口PasswordEncoder接口 认证登录校验密码加密存储退出登录 前言 本文是作者学习三更老师的Spring Security课程所记录的学习心得和笔记知识&#xff0c;希望能帮助到大家 Spring Sec…

单分支:if语句

示例&#xff1a; /*** brief how about if? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>#define if_state…

C语言学习/复习23---

一、数据的存储 二、数据类型的介绍 三、整型在内存中的存储 将原码转换为补码。如果数是正数&#xff0c;则补码与原码相同&#xff1b;如果数是负数&#xff0c;则先将原码按位取反&#xff0c;然后加1。将补码转换原补码。如果数是正数&#xff0c;则补码与原码相同&#x…

【笔试强训】双指针的思想!

1.数组中字符串的最小距离 题目链接 解题思路&#xff1a; 小技巧 ✌&#xff1a;标记两个字符串是否被找到&#xff0c;每次找到一个字符串就更新一次答案来保证找到的是最小距离。 实现代码&#xff1a; #include <iostream> using namespace std;int main() {in…

快手本地生活服务商系统怎么操作?

当下&#xff0c;抖音和快手两大短视频巨头都已开始布局本地生活服务&#xff0c;想要在这一板块争得一席之地。而这也很多普通人看到了机遇&#xff0c;选择成为抖音和快手的本地生活服务商&#xff0c;通过将商家引进平台&#xff0c;并向其提供代运营服务&#xff0c;而成功…

截图快捷键失效的解决方法 _ 统信UOS _ 麒麟KOS _ 中科方德NFS

原文链接&#xff1a;截图快捷键失效的解决方法 | 统信UOS | 麒麟KOS | 中科方德NFS Hello&#xff0c;大家好啊&#xff01;在日常使用计算机时&#xff0c;截图功能是我们经常需要用到的一个实用工具&#xff0c;它可以帮助我们快速保存屏幕上的信息&#xff0c;用于报告错误…

恭喜上岸的准研究生们,入学后还有这些奖学金

很多学校都开设了研究生的新生奖学金&#xff0c;有些学校是不分学校等级的全覆盖&#xff0c;比如北京科技大学前两年给研一新生每人发1万。 一般来说&#xff0c;新生奖学金的等级划分就是按考研成绩&#xff0c;所以大家一定要尽可能的考高的分数&#xff0c;不仅仅对评奖学…

云HIS医院管理系统源码 SaaS模式 B/S架构 基于云计算技术

一、系统概述 云HIS系统源码是一款满足基层医院各类业务需要的健康云产品。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、收费管理、病患问诊、电子病历、开药发药、住院检查、会员管理、财务管理、统计查询、医生工作站和护士工作站等一系列常规功…

累积分布函数图(CDF)的介绍、matlab的CDF图绘制方法(附源代码)

在对比如下两个误差的时候&#xff0c;怎么直观地分辨出来谁的误差更低一点&#xff1f;&#xff1a; 通过这种误差时序图往往不容易看出来。 但是如果使用CDF图像&#xff0c;以误差绝对值作为横轴&#xff0c;以横轴所示误差对应的累积概率为纵轴&#xff0c;绘制曲线图&am…

gitlab(docker)安装及使用

GitLab GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 下载(docker) 查询docker镜像gitlab-ce gitlab-ce是它的社区版 [rootlocalhost ~]# docker search gitlab-ce NAME …

Xshell和XFtp下载和使用

Xshell和XFtp下载和使用 最好是官网直接下载。 链接: Xshell官网 Xshell官网最近出了免费个人使用版&#xff0c;但是我直接下载的话感觉非常非常慢&#xff0c;或许挂个梯子会好的多。看到图片的红色字没&#xff0c;可能被骗的人比较多。运行之前的Xshell会显示需要最新版的软…

python/pygame 挑战魂斗罗 笔记(二)

一、建立地面碰撞体&#xff1a; 现在主角Bill能够站立在游戏地图的地面&#xff0c;是因为我们初始化的时候把Bill的位置固定了self.rect.y 250。而不是真正的站在地图的地面上。 背景地图是一个完整的地图&#xff0c;没有地面、台阶的概念&#xff0c;就无法通过碰撞检测来…

Java中类装载的执行过程

类装载的执行过程 类从加载到虚拟机中开始&#xff0c;直到卸载为止&#xff0c;它的整个生命周期包括了&#xff1a;加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中&#xff0c;验证、准备和解析这三个部分统称为连接&#xff08;linking&#xff09;。 1.加载 …

《八》QSplitter拆分器以及QDockWidget窗口详解

QSplitter简介 QSplitter拆分器允许用户通过拖动子部件之间的边界来控制它们的大小。 单个拆分器可以控制任意数量的小部件。QSplitter的典型用法是创建几个小部件&#xff0c;并使用insertWidget()或addWidget()添加它们。 常用方法 默认情况下&#xff0c;QSplitter会动态…

ollama大语言模型

查看已经安装的大语言模型 ollama list运行大语言模型 ollama run llama2:latest