java第二十七课 —— 多态的应用(二)| equals 方法

多态的应用

多态参数

方法定义的形参类型为父类类型,实参类型允许为子类类型。

应用实例1:前面的主人喂动物例子

应用实例2:定义员工类 Employee,包含姓名和月工资 [private] ,以及计算年工资 getAnnual 的方法。普通员工和经理继承了员工,经理类多了奖金 bonus 属性和管理 manage 方法,普通员工类多了 work 方法,普通员工和经理类要求分别重写 getAnnual 方法。

  1. 测试类中添加一个方法,showEmpAnnual(Employee e),实现获取任何员工对象的年工资,并在 main 方法中调用该方法[e.getAnnual()]。
  2. 测试类中添加一个方法,testWork,如果是普通员工,则调用 work 方法,如果是经理,则调用 manage 方法。

PolyParameter.java:

package com.hspedu.poly_.polyparameter_;public class PolyParameter {public static void main(String[] args) {Worker tom = new Worker("Tom", 3000);Manager john = new Manager("John", 30000, 100000);PolyParameter polyParameter = new PolyParameter();polyParameter.showEmpAnnual(tom);polyParameter.showEmpAnnual(john);polyParameter.testWork(tom);polyParameter.testWork(john);}public void showEmpAnnual(Employee employee){System.out.println(employee.getName() + " 的年工资为: " + employee.getAnnual());}public void testWork(Employee employee){if(employee instanceof Worker){((Worker) employee).work();//向下转型}else if(employee instanceof Manager){((Manager) employee).manage();//向下转型}else {System.out.println("输入有误...");}}
}

Employee.java:

package com.hspedu.poly_.polyparameter_;public class Employee {private String name;private double salary;public Employee(String name, double salary) {this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public double getAnnual(){return 12 * salary;}
}

Manager.java:

package com.hspedu.poly_.polyparameter_;public class Manager extends Employee {private double bonus;public Manager(String name, double salary, double bonus) {super(name, salary);this.bonus = bonus;}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;}public void manage(){System.out.println("经理 " + getName() + " 正在工作...");}@Overridepublic double getAnnual() {return super.getAnnual() + bonus;}
}

Worker.java:

package com.hspedu.poly_.polyparameter_;public class Worker extends Employee {public Worker(String name, double salary) {super(name, salary);}public void work(){System.out.println("普通员工 " + getName() + " 正在工作...");}@Overridepublic double getAnnual() {//因为普通员工没有其他收入,直接调用父类方法return super.getAnnual();}
}

Object 类详解

equals 方法

== 和 equals 的对比(面试题)

== 是一个比较运算符。

  1. 既可以判断基本类型,又可以判断引用类型。

  2. 如果判断基本类型,判断的是值是否相等。eg: int i = 10; double d = 10.0;

  3. 如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象。

    Equals01.java:

    package com.hspedu.object_;public class Equals01 {public static void main(String[] args) {A a = new A();A b = a;A c = b;System.out.println(a == c);//trueSystem.out.println(b == c);//trueB bObj = a;System.out.println(bObj == c);//trueint num1 = 10;double num2 = 10.0;System.out.println(num1 == num2);//true}
    }
    class B{}
    class A extends B{}
    

equals 是 Object 类中的方法。

  1. 只能判断引用类型。

    System.out.println("hello".equals("abc"));
    
  2. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如,Integer,String。

    Integer integer1 = new Integer(1000);
    Integer integer2 = new Integer(1000);
    System.out.println(integer1 == integer2);//false 因为是两个不同的对象
    System.out.println(integer1.equals(integer2));//true 因为这里比较的是内容String str1 = new String("hspedu");
    String str2 = new String("hspedu");
    System.out.println(str1 == str2);//false
    System.out.println(str1.equals(str2));//true
    

    如何重写 equals 方法

    应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。

    EqualsExercise01.java:

    package com.hspedu.object_;public class EqualsExercise01 {public static void main(String[] args) {Person person = new Person("Jack", 18, '男');Person person1 = new Person("Jack", 18, '男');System.out.println(person.equals(person1));//true}
    }
    class Person{// 默认 extends Objectprivate String name;private int age;private char gender;// 重写 Object 的 equals 方法public boolean equals(Object obj){//削断如果比较的两个对象是同一个对象,则直接返回trueif(this == obj){return true;}else if (obj instanceof Person){//进行向下转型Person person = (Person)obj;//需要拿到obj的构造属性return this.name.equals(person.name) && this.age == person.age && this.gender == person.gender;}else{return false;}}public Person(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}
    }
    

    练习题

第一题:

class Person{public String name;
}
Person p1 = new Person();
p1.name = "hspedu";
Person p2 = new Person();
p2.name = "hspedu";
System.out.println(p1 == p2);//false
System.out.println(p1.name.equals(p2.name));//true
System.out.println(p1.equals(p2));//false
String s1 = new String("asdf");
String s2 = new String("asdf");
System.out.println(s1.equals(s2));//true
System.out.println(s1 == s2);//false

第二题:

int it = 65;
float f1 = 65.0f;
System.out.printIn("65 和 65.0f 是否相等?"+ (it == fl));//true
char ch1 = 'A';
char ch2 = 12;
System.out.println("65 和 'A’ 是否相等?" + (it == ch1));//true
System.out.println("12 和 ch2 是否相等?" + (12 == ch2));//true
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(" str1 和 str2 是否相等?" + (str1 == str2))//false
System.out.println("str1 是否 equals str2?" + (str1.equals(str2)));//true
System.out.println("hello" == new java.sql.Date());//对象不同,无法比较,编译器报错

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

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

相关文章

2352.相等行列对

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。 示例 1: 输入&#xff1a…

Wireshark的基本用法以及注意事项

Wireshark 是一个流行的网络协议分析工具,可以捕获和分析网络数据包。以下是一些常见的 Wireshark 的用法: 安装和启动:首先需要下载和安装 Wireshark。安装完成后,可以通过启动 Wireshark 应用程序来打开它。 选择网络接口&…

Java——包

一、包 1、简要介绍 在Java编程语言中,包(Package) 是一种用来组织和管理类(Class)和接口(Interface)的机制。包为开发者提供了一种逻辑分组的方式,使代码更加模块化、结构化和易于…

【前端技术】标签页通讯localStorage、BroadcastChannel、SharedWorker的技术详解

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

Spring Boot框架的原理及应用详解(一)

本系列文章简介: 在当今的软件开发世界中,快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目,自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性,迅速在Java开发社…

Redis大key有什么危害?如何排查和处理?

什么是 bigkey? 简单来说,如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。具体多大才算大呢?有一个不是特别精确的参考标准: String 类型的 value 超过 1MB 复合类型(Li…

使用Python读取表格中的某一行数据

import pandas as pdfile_path C:\Users\EDY\PJ-IPAStudio\designer\project\导入项目PUvNit.xlsxdef get_header_as_array(file_path):try:# 使用 pandas 读取 Excel 文件df pd.read_excel(file_path, headerNone, nrows1) # 只读取第一行# 将 pandas Series 转换为列表hea…

request.getParameter()方法总结

request.getParameter()方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java Web开发中,request.getParameter()方法是用于获取HTTP请求…

关于解耦的一点思考

解耦 解耦是指解除不同模块或系统之间的紧密关联或相互依赖关系。 在技术领域,通过解耦可以使各个部分相对独立地进行开发、维护和修改,而不会对其他部分产生过多的直接影响。 这样能提高系统的灵活性、可扩展性和可维护性。 常见解耦方式 包括&…

一个漂亮的网站收藏函数

<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>网站收藏</title><style>body …

云手机群控功能讲解

接触云手机之前&#xff0c;很多企业或者个人卖家都对群控有浓厚的兴趣&#xff0c;云手机群控具体是什么呢&#xff1f;云手机群控&#xff0c;顾名思义&#xff0c;是指能够同时对多台云手机进行集中控制和管理的功能。打破了传统单台手机操作的限制&#xff0c;实现了规模化…

高精度乘法的实现

这是C算法基础-基础算法专栏的第九篇文章&#xff0c;专栏详情请见此处。 引入 上次我们学习了高精度加法的实现&#xff0c;这次我们要学习高精度减法的实现。 高精度乘法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的…

查看LabVIEW及各个模块和驱动的版本号

要方便地查看当前计算机上安装的LabVIEW版本以及各个模块和驱动的版本号&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用NI MAX (Measurement & Automation Explorer) NI MAX 是一个强大的工具&#xff0c;可以帮助你管理National Instruments硬件、软件和驱动程序…

Docker(三)-Docker常用命令

1.run run命令执行流程:2.帮助启动类命令 2.1 启动docker systemctl start docker2.2 停止docker systemctl stop docker2.3 重启docker systemctl restart docker2.4查看docker状态 systemctl status docker2.5开机启动 systemctl enable docker2.6查看docker概要信息 …

c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写

前言 在上一篇文章中我们介绍了在计算机底层视角下的虚拟内存和操作系统在用户层所进行的各个分层&#xff0c;在这篇文章我们就要开始尝试书写多线程代码了,其实在c11后c就提供供了线程类给我们使用,c线程类其实主要是对c操作多线程的函数进行了封装&#xff0c;本质上其实是…

VB.net实战(VSTO):VSTOwpf体验框架打包教程

如果是考虑到Wps用户较多&#xff0c;就不建议采用侧边栏的形式 只是个体验框架&#xff0c;界面未作美化&#xff0c;office的用户可以用任意一种窗体&#xff0c;喜欢那个界面就写那个界面&#xff0c;wps的侧边栏只能弹出一部分&#xff0c;每次需要的手动拖动。 打包了案例…

Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录 文件字节输入流&#xff1a;每次读取多个字节 实例演示 注意事项 文件字节输入流&#xff1a;一次读取完全部字节 方式一 方式二 注意事项 文件字节输入流&#xff1a;每次读取多个字节 用到之前介绍过的常用方法&#xff1a; 实例演示 需求&#xff1a;用每次读取…

【泛微系统】e-cology非标配功能概览

关于泛微非标功能的功能编号、功能名称及支持版本 编号名称支持版本001考勤功能4.500.0124-9.00+KB900190206002短信通用接口5.000.0327+KB50001003 及以上版本004计划任务接口5.0+KB50001003及以上版本005集成登录接口6.0及以上版本006流程中自定义浏览框5.0+KB50001003及以上…

小程序项目业务逻辑回忆4

用户查询积分 积分获取规则如下: 邀请其他用户购票参会,将获取该用户花费金额的10%获取积分。 邀请用户注册参观展览&#xff0c;需注册并现场签到&#xff0c;将获取10分的奖励积分。 邀请企业用户参展&#xff0c;将获取企业参展金额的5%获取到积分。 上述3条积分获取规…

诸茅的黄昏

内容提要 白酒大陆的坍塌终于到达茅台的地盘&#xff0c;一切发生得太快了。突然间&#xff0c;深厚的护城河消失了&#xff0c;医药茅、眼科茅、牙科茅、疫苗茅、酱油茅都挣扎于内需的泥沼中。旧茅衰退&#xff0c;新茅生长&#xff0c;在下行周期&#xff0c;内需仍有结构性…