面向对象编程主线五

news2024/9/27 9:30:10

面向对象编程

五、第五阶段–多态性

5.1、理解多态性

  1. 理解多态性:可以理解为一个事物的多种形态;

  2. 何为多态性:

    1. 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
  3. 多态的使用,虚拟方法调用:当掉用子父类同名同参数的方法时。实际执行的是子类重写父类的方法

    1. 有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法

      总结:编译,看左边;运行,看右边。

  4. 多态性的使用前提:

    ​ ① 类的继承关系

    ​ ② 要有方法的重写

  5. 对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)

package cs20230316.java1;

public class PersonTest {
    public static void main(String[] args) {
        Person p1 =new Person();
        p1.eat();

        Man man = new Man();
        man.earnMoney();
        man.eat();
        //对象的多态性:父类的引用指向子类的对象
        Person p2 = new Man();
        Person p3 = new Woman();
        //多态的使用:当掉用子父类同名同参数的方法时。实际执行的是子类重写父类的方法----虚拟方法调用
        p2.eat();
        p3.eat();
        //p2.earnMoney();//Person中没有该方法,所以不能编译通过
    }
}

5.2、方法的重载与重写

1.二者的定义细节:略

2.从编译和运行的角度看:
重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为**“早绑定”或“静态绑定”
而对于
多态**,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为**“晚绑定”或“动态绑定”**。
引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”

5.3、instanceof

有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

如何才能调用子类特有的属性和方法?

答:向下转型:使用强制类型转换符。

//对象的多态性:父类的引用指向子类的对象
Person p2 = new Man();
Man m1 = (Man) p2;

使用强转时,可能出现ClassCastException的异常!

5.3.1、使用方法

a instanceof A判断对象a是否是类A的实例,如果是,返回true;如果不是。返回false。

使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行 instanceof的判断,一旦返回true,就进行向下转型;如果返回false,不进行向下转型。

//练习:
//问题一:编译时通过,运行时不通过
//举例一
Person p4 = new Woman();//Woman和Man都是Person的子类,不能相互转换
Man m3 = (Man) p3;
//举例二
Person p5 = new Person();
Man m4 = (Man) p5;//new 的就是 Person,不能转为子类

//问题二:编译通过,运行时也通过
Object obj = new Woman();//Object是间接父类
Person p = (Person) obj;//Persons 直接父类,让间接父类转为直接父类是可行的

//问题二:编译不通过
Man m5 = new Woman();

image.png

5.4、多态性的总结和理解

  1. 子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中:编译看左边,运行看右边
  2. 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量编译运行都看左边
  • 谈谈你对多态性的理解?(还需重点理解)

    ① 实现代码的通用性。

    ② Object类中定义的public boolean equals(object obj){}

    ​ JDBC:使用java程序操作(获取数据库连接,CRUD)数据库(MySQL、Oracle、DB2、SQL Server )

    ③ 抽象类、接口的使用肯定体现了多态性。(抽象类、接口不能实例化)

5.5、Object类的使用

java.lang.Object类

  1. Object类是所有Java类的根父类

  2. 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类

  3. Object类的方法具有通用性

    1. 属性:无

    2. 方法:equals() / toString() / getClass() / hashCode() / clone() / finalize()

      wait() 、 notify() 、notifyAll()

面试题:final、 finally 、finalize的区别?

5.5.1、equals()方法和==运算符

面试题: == 和 equals() 区别

5.5.1.1、== 运算符

​ ① 可以使用在基本数据类型变量和引用数据类型变量中

​ ② 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同,因为有自动类型提升)

​ ③ 如果比较的是引用数据类型变量:比较两个变量的地址值是否相等。即两个引用是否指向同一个对象实体

补充: == 符号使用时,必须保证符号左右两边的变量类型一致。

//基本数据类型
int i = 20;
char c = 20;
System.out.println(c == i);//true

char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true

//引用数据类型
//因为都是 new 了不同的对象
Customer cust1 = new Customer("Tom","Andy");
Customer cust2 = new Customer("Tom","Andy");
System.out.println(cust2 == cust1);//false

String str1 = new String("Cute");
String str2 = new String("Cute");
System.out.println(str2 == str1);//false

5.5.1.2、equals()方法

equals()方法的使用:

① 是一个方法,而非运算符

② 只能适用于引用数据类型

③ Object类中equals()方法的定义:

public boolean equals(Object obj) {
    return (this == obj);
}
说明:Object类中定义的equals()方法和 == 的作用是相同的,比较两个对象的比较两个变量的地址值是否相等。即两个引用是否指向同一个对象实体

④ 像 String 、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。

⑤ 通常情况下,我们自定义的类如果使用equals()方法的话,也通常是比较两个对象的“实体内容”是否相同。那么,我们就需要对Object类中的equals()方法重写

​ 重写的原则:比较两个对象的实体内内容是否相同。

5.5.1.3、toString()方法

Object类中toString()的使用

  1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
  2. Object类中toString()的定义:
  3. 像String 、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回“实体内容”信息。
  4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”。
Object类中toString()的定义:
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

5.5.2、单元测试方法的使用

想测试哪一块就单独测试这一块,其他不测试。

JUnit

Eclipse中单元测试的使用

Java中的JUnit单元测试
步骤:
1.选中当前工程–右键选择: build path - add libraries - JUnit 4 -下一步
2.创建Java类,进行单元测试。
此时的Java类要求:此类是public的2此类提供公共的无参的构造器
3.此类中声明单元测试方法。
此时的单元测试方法:方法的权限是public,没有返回值,没有形参
4.此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test;
5.声明好单元测试方法以后,就可以在方法体内测试相关的代码。
6.写完代码以后,左键双击单元测试方法名,右键:run as - JUnit Test
    说明:
    1.如果执行结果没有任何异常:绿条
    2.如果执行结果出现异常:红条

5.6、包装类(Wrapper)

image.png

虚线框中的都是数值类,父类都是Number

5.6.1、包装类的使用

  1. java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征

  2. 掌握的:基本数据类型、包装类、String三者之间的相互转换

    ① 基本数据类型–>包装类:调用包装类的构造器,见5.6.2的自动封箱、自动拆箱

    ② 包装类–>基本数据类型:调用包装类的Xxx的xxxValue(),如:intValue()、floatValue():见5.6.2的自动封箱、自动拆箱

    基本数据类型、包装类–>String类型:调用String重载的valueOf(Xxx xxx)

    String类型–>基本数据类型、包装类:调用包装类中的parseXxx(String s)

    //基本数据类型、包装类-->String类型
    int num4 = 10;
    //方式一:连接运算
    String str1 = num4 + "";
    //方式二:调用String重载的valueOf(Xxx xxx)
    float f1 = 12.3f;
    String str2 = String.valueOf(f1);//12.3
    
    Double d1 = 12.4;
    String str3 = String.valueOf(d1);
    
 //String类型-->基本数据类型、包装类:调用包装类的 parseXxx(String s)
        String str5 = "123a";
        //错误写法
//        int num1 = (int) str5;
        //可能会报 NumberFormatException的错,所以必须保证String的数据可以转换
        int n1 = Integer.parseInt(str5);
        System.out.println(n1+5);

        //只要不是 true,就全部都是false
        String s2 = "true ";
        boolean b1 = Boolean.parseBoolean(s2);

5.6.2、JDK5.0新特性

JDK5.0新特性:自动装箱自动拆箱

//自动装箱:基本数据类型-->包装类
int num2 = 10;
Integer int1 = num2;//自动装箱
System.out.println(int1);

boolean b2 = true;
Boolean b3 = b2;//自动装箱
System.out.println(b3);
//自动拆箱:包装类-->基本数据类型
System.out.println(int1.toString());//自动拆箱

int num3 = int1;//自动拆箱
System.out.println(num3);
//自动装箱:基本数据类型-->包装类
int num2 = 10;
Integer int1 = num2;//自动装箱
System.out.println(int1);

boolean b2 = true;
Boolean b3 = b2;//自动装箱
System.out.println(b3);
//自动拆箱:包装类-->基本数据类型
System.out.println(int1.toString());//自动拆箱

int num3 = int1;//自动拆箱
System.out.println(num3);

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

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

相关文章

味尚食品 味尚拉面半干面是一种非常经典的中式面食

尊敬的客户,您好!感谢您对我们电商平台的关注,我们很高兴为您介绍我们平台上的一款热销产品——味尚拉面半干面。 味尚拉面半干面是一种非常经典的中式面食,其主要特点体现在面条的口感和味道方面,让人感觉仿佛在享受正…

infinigen安装教程

至于infinigen是什么,网上很多,这篇文章主要是我安装的记录 官网:https://infinigen.org/ github:https://github.com/princeton-vl/infinigen 安装 首先要配置wsl环境,如何配置wsl,可以关注公众号“科…

依次判断数组中的各元素是否以指定后缀作为结尾numpy.char.endswith()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 依次判断数组中的各元素 是否以指定后缀作为结尾 numpy.char.endswith() [太阳]选择题 下列代码最后输出的结果是? import numpy as np s np.array([teacher, student]) print(&…

Spring Boot 中的定时任务是什么, 如何使用

Spring Boot 中的定时任务是什么, 如何使用 Spring Boot 是一个非常流行的 Java Web 开发框架,它可以帮助开发者快速搭建一个 Web 应用程序。为了能够更好地管理后台任务,Spring Boot 提供了一种方便的方式来调度定时任务。这个功能被称为 Spring Boot …

Python应用实例(一)外星人入侵(四)

外星人入侵(四) 1.前文总结回顾1.1 alien_invasion.py1.2 settings.py1.3 ship.py 2.射击2.1 添加子弹设置2.2 创建Bullet类2.3 将子弹存储到编组中2.4 开火2.5 删除消失的子弹2.6 限制子弹数量2.7 创建方法_update_bullets() 1.前文总结回顾 1.1 alien…

java项目之汽车在线销售系统(ssm+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的汽车在线销售系统。 开发环境: 后端: 开发语言:Java 框架:ssm,mybatis JDK版…

电脑提示找不到应用程序怎么办?

无论个人电脑还是办公电脑,无一例外的都会安装一些应用程序来帮助我们使用。而在电脑的使用过程中总会出现一些大大小小的问题,其中双击桌面快捷方式显示找不到应用程序是一个比较常见的故障。那么,电脑找不到应用程序怎么解决呢? 电脑找不到…

RabbitMQ学习笔记8 高级特性 消息可靠性+消费

我们在测试类中去写一个方法去实现它: 运行: 我们去掉之前的消息鉴定,我们这里不用消息鉴定。 我们注释掉这个。再去运行: 我们现在模拟一下发送失败的情况: 之前我们设置了我们交换机的名称。 我们在测试类发送消息时…

如何提高力扣(Leetcode)的解题能力?

如何提高力扣(Leetcode)的解题能力? 力扣(Leetcode)是一个在线编程平台,提供了各种算法和数据结构的题目,让程序员可以练习和提高自己的编程技能。很多人都把力扣(Leetcode&#xf…

【脚本语言】Shell Script - 终端打印指令

目录 终端打印 基础语法 有趣的拓展 在echo中使用转义序列 输出彩色文本 终端打印 终端是交互式工具,在终端中打印文本是绝大多数脚本中的基本任务。 基础语法 终端打印有两种方法输出文本,分别是 echo 和 printf (就是C/C中的那个)。 在默认情况下…

Git---标签管理

文章目录 前言一、理解标签二、创建标签三、操作标签总结 前言 正文开始!!! 一、理解标签 标签tag,可以简单的理解为是对某次commit的一个标识,相当于起了一个别名.例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义. 这有什么用呢?…

信息系统项目管理师(第四版)教材精读思维导图-第一章信息化发展

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 思维导图源文件下载: https://download.csdn.net/download/hanjingjava/8801629…

如何在工作中保持稳定的情绪

如何在工作中保持稳定的情绪 在高压的工作环境中,保持稳定的情绪对于程序员来说至关重要。作为一个程序员,我们常常面临着各种技术挑战、项目期限和团队合作的压力。在这样的环境下,情绪的波动可能会影响我们的工作效率和质量。因此&#xff…

使用OpenCV显示图像的RGB颜色直方图

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv;int main( ) {Mat srcImage;srcImage=<

数据特征降维 | 主成分分析PCA数据特征降维

文章目录 效果一览文章概述部分源码部分源码参考资料效果一览 文章概述 数据特征降维 | 主成分分析PCA,(主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征) 部分源码 部分源码 %% 清空环境变量 warning off % 关闭报警信息 close a…

linux:ubuntu命令行扩容

参考&#xff1a; ubuntu 20.04 逻辑卷 ext4 文件系统扩容_mob604757006a49的技术博客_51CTO博客 总结&#xff1a; 准备步骤&#xff08;链接里没有说明&#xff0c;我参考了其他的帖子增加的一步&#xff09;&#xff1a; 1.关闭虚拟机&#xff0c;右键虚拟机&#xff0c;选择…

【枚举+容斥】牛客练习赛113 F

牛客练习赛113_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 这道题根本不是子序列DP&#xff0c;因为子序列内部是无序的&#xff0c;这点没意识到 这是问题的easy版本&#xff0c;这种easy版本的题一般都是去…

Windows下PaddleOCR用NCNN部署

1.所用到的ncnn格式的模型文件 要问这些模型哪里来的&#xff0c;请看下面提示信息: 2.查看字典函数读取方法 char* readKeysFromAssets() {std::ifstream ifs("./model/paddleocr_keys.txt");if (!ifs.is_open()){return 0;}ifs.seekg(0, std::ios_base::end);int …

[桌面运维]PC常用的视频接口,显示器VGA、DVI、HDMI、DP、USB-C接口的认识和应用

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

keepalived

文章目录 一、suse系统安装keepalived1.1、准备环境1.2、修改主机名1.3、关闭防火墙1.4、配置网络1.5、配置 yum 源1.6、安装 mysql1.7、安装 keepalived报错信息&#xff1a;使用 wget 下载keepalived 报错解决 使用 wget 下载 keepalived的报错 一、suse系统安装keepalived …