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

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

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

了解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.mzph.cn/diannao/257.shtml

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

相关文章

【Python系列】非异步方法调用异步方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

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

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

【简单介绍下日常的启发式算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

CLSRSC-400: A system reboot is required to continue installing

RHEL 7.9ORACLE RAC 12.2.0.1.0&#xff0c;在运行root.sh脚本时&#xff0c;出现CLSRSC-400: A system reboot is required to continue installing报错 # /u01/app/12.2.0/grid/root.sh Performing root user operation.The following environment variables are set as:ORA…

在Windows安装R语言

直接安装R语言软件 下载网址&#xff1a;R: The R Project for Statistical Computing 下载点击install R for the first time 通过Anaconda下载RStudio 提前下载好Anaconda 点击Anaconda Navigate 点击RStudio的Install下载就好了

《大话数据结构》04 静态链表

1. 静态链表 其实C语言真是好东西&#xff0c;它具有的指针能力&#xff0c;使得它可以非常容易地操作内存中的地址和数据&#xff0c;这比其他高级语言更加灵活方便。后来的面向对象语言&#xff0c;如Java、C#等&#xff0c;虽不使用指针&#xff0c;但因为启用了对象引用机…

C语言进阶课程学习记录-第36课 - 函数与指针分析

C语言进阶课程学习记录-第36课 - 函数与指针分析 函数类型实验-函数指针实验-回调机制小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 函数类型 实验-函数指针 #include <stdio.h>typedef in…

PLC工业网关,实现PLC联网

在当今工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为控制系统的核心&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;随着工业互联网和智能制造的快速发展&#xff0c;如何实现PLC的联网通信&#xff0c;提高数据传输效率&#xff0c;成…

Redis教程——数据类型(哈希、集合)

上篇文章我们学习了Redis教程——数据类型&#xff08;字符串、列表&#xff09;&#xff0c;这篇文章学习Redis教程——数据类型&#xff08;哈希表、集合&#xff09; 哈希表Hash 哈希表是一个string类型的field(字段)和value(值)的映射表&#xff0c;hash特别适合用于存储…

C语言进阶课程学习记录-函数指针的阅读

C语言进阶课程学习记录-函数指针的阅读 5个标识符含义解析技巧 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 5个标识符含义解析 int (*p1) (int* , int (*f) ( int* ) );定义了指针p1,指向函数&#…

OpenHarmony实战开发-如何通过分割swiper区域,实现指示器导航点位于swiper下方的效果。

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 1.加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 1.将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区…

采用等价类划分法设计测试用例

例题1 请采用等价类划分法设计测试用例。 考虑软件 app, 它有两个输入变量 , 分别是 name 和 age, 其中 ,name 是至多包含 20 个字母字符的非空字符串 ,age 是整数型变量 ,0 ≤ age ≤ 120 。当输入给 name 的字符串的长度超过 20时 ,name 取前 20 个字符作为 name 的值 ; 如果…

【面试经典 150 | 二分查找】搜索旋转排序数组

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

宏集eX700M系列HMI实现港口设备数据上云

前言 随着港口设备信息化技术的快速发展&#xff0c;越来越多的企业想要把现场设备数据上传到云平台&#xff0c;进而实现关键数据的远程监控和分析处理。在此背景下&#xff0c;国内某信息化公司想要将港口设备数据通过MQTT上传到该公司自研IOT平台&#xff0c;实现数据上云&…

java项目的构建工具-Maven

黑马程序员JavaWeb开发教程 文章目录 一、概述1、介绍&#xff08;1&#xff09;介绍&#xff08;2&#xff09;Maven的作用&#xff08;3&#xff09;官网&#xff08;4&#xff09;仓库 2、安装 二、IDEA 集成 Maven1、配置Maven环境2、创建Maven项目&#xff08;1&#xff0…

入门必备:MySQL本地安装(Windows11)

下载安装 社区版下载地址:https://dev.mysql.com/downloads/ 选择合适自己操作系统的版本&#xff1a; 下载完成后是一个.msi文件&#xff0c;双击安装即可&#xff1b; 接下来请看图&#xff1a; 上面的步骤完成后&#xff0c;大概会弹出黑窗口并且有下面的UI界面&#xff…

Simlab python二次开发1-将所有缸套内表面半径加大1mm

Simlab python二次开发1-将所有缸套内表面半径加大1mm 1、打开模型文件2、getBodiesWithSubString&#xff08;&#xff09;从名字得到Bodies3、建Body类Group3.1、定义放入Group中的Bodies3.2、建Group 4、将缸套内表面建组&#xff0c;并扩半径1mm4.1、simlab.getBodiesFromG…

密码学 | 数字签名 + 数字证书

&#x1f951;原文&#xff1a;数字签名和数字证书的原理解读 - 知乎 &#x1f951;声明&#xff1a;后文图中若未明确指明&#xff0c;默认是 Bob 的公钥或私钥。 Step1&#xff1a;Bob 有两把钥匙&#xff0c;一把是公钥&#xff0c;另一把是私钥。 Step2&#xff1a;Bob 把…

基于Springboot+Vue的Java项目-企业客户管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

00_Linux

文章目录 LinuxLinux操作系统的组成Linux的文件系统Linux操作系统中的文件类型Linux操作系统的组织结构 Linux vs WindowsNAT vs 桥接模式 vs 仅主机Linux Shell命令Linux⽂件与⽬录管理相关指令目录文件普通文件文本编辑 用户管理添加用户删除用户用户组管理 文件权限管理权限…