多态介绍。

2023-11-10

@Override 规范上 推荐加上 帮你校验是否是方法重写

方法重写在子类继承了父类的方法之后,如果发现在当前的需求下,父类的方法不够强大,所以在子类中就可以对此方法进行重写。

特点:

1. 方法名相同
2. 参数列表相同
3. 返回值类型不能大于父类
4. 访问修饰符不能严于父类
5. 不能抛出比父类更大的异常

方法重载在同一个类中,方法名相同,参数列表不同(类型,个数,顺序),与方法的返回值类型和访问修饰符无关。

Object:超类,顶级父类。Java中的所有类都直接或者间接继承自它。

Arrays.toString();

String的equals();

为什么要进行重写equals()和hashcode()

String类重写了equals方法
为什么要重写equals()方法。Java 类都继承自Object 类,而Object 类提供的用于比较对象是否相等的方法equals(),通常只是比较两个引用是否指向内存中的同一个对象。我们在定义类时,我们经常会希望两个不同对象的某些属性值相同时就认为他们相同,所以我们要重写equals()方法,按照原则,我们重写了equals()方法,也要重写hashCode()方法。

重点要注意的是:

a. 在java应用程序运行时,无论何时多次调用同一个对象时的hashCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值;

b. 如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值;

c. 如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同;
现在,我们到这里可以看出,我们重写了equals()方法也要重写hashCode()方法,这是因为要保证上面所述的b,c原则;所以java中的很多类都重写了这两个方法,例如String类

两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true

equals()和==的区别:

== 表是判断是否相等,如果比较基本数据类型,比较的是值的内容。而如果比较引用数据类型,比较的是内存地址。
equals() 基本类型之间无法使用equals比较,比较引用数据类型的时候,比较的是值内容

equals()默认情况下在Object中的实现和==是一致的。但是例如String类型就对equals()做了重写。(最终的最终比较的是两个字符串中字符数组而已)

    public boolean equals(Object obj) {
        return (this == obj);
    }

toString()

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

cn.kgc.demo1.User@7852e922

重写了对应类的toString()之后:

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

面向对象的三大特性之一。

在这里插入图片描述

public static void main(String[] args) {
		String[] a = {"1","2","3"};
		String b="1";
		if(b==(a[0])) {
			System.out.println("a=b");
		}else {
			System.out.println("a!=b");
		}
		
		String c =new String("1");
		if (c==a[0]) {
			System.out.println("a=c");
		}else {
			System.out.println("a!=c");
		}
	}

输出a=b
a!=c

1. 掌握为什么要使用多态?(初级的使用)

2. 掌握如何使用多态?(初级的使用)

  1. 父类的引用作为方法的形参

    1. 编写宠物主人类,在宠物主人类给不同的宠物喂食.

      public class Master{
          
          public void feedDog(Dog dog){
              dog.eat();
          }
          public void feedPenguin(Penguin penguin){
              penguin.eat();
          }
          ....
      }
      
    2. 缘由:发现如果未来还要领养更多的宠物,那么肯定要增加更多的喂食方法!

      使用多态来进行优化。 父类的引用作为方法的形参。

      public class Master{
          // 父类的引用可以传入子类的对象
          public void feedDog(Pet pet){ 
              pet.eat();
          }
      }
      
    3. 导致的缘由(牵连):因为这时候调用的是Pet这个父类中的通用方法,所以导致不同的宠物,吃食是一样的,但是显然不可能。

      父类的方法不够强大时,子类要进行方法重写!

      在多态的场景下,如果调用方法,实际执行的是子类重写后的方法。

      public class Pet{
          public void eat(){
              
          }
      }
      public class Dog{
      	@Override
          public void eat(){
              syso("吃骨头!");
          }
      }
      public class Penguin{
          @Override
          public void eat(){
              syso("吃鱼!");
          }
      }
      
    4. 牵连导致!我们发现父类中的eat()方法,根本就没有必要再进行实现!里面多一行代码都是浪费。

      但是这个方法是不能被删除的,因为父类的引用要调用,子类还要进行重写。

      将此方法定义为抽象方法。

      由它又导致,这个类变为了抽象类。

      public abstract class Pet{
      	// 抽象方法没有方法体   而且 必须被子类重写
          public abstract void eat();
      }
      
  2. 父类的引用作为方法的返回值类型

    1. 编写宠物商店类,宠物商店有不同宠物的领养方法。

      public class PetStore {
      	/**
      	 * 领养狗
      	 * @return
      	 */
      	public Dog getDog() {
      		Dog dog = new Dog();
      		return dog;
      	}
      	
      	/**
      	 * 领养企鹅
      	 * @return
      	 */
      	public Penguin getPenguin() {
      		Penguin penguin = new Penguin();
      		return penguin;
      	}
      }
      
    2. 缘由:未来可能宠物店有更多的宠物可以被领养,那么就需要编写N多个方法用于不同宠物的领养。

      使用多态来优化,因为最终无论是返回什么宠物,它们都是Pet类的子类。]

      public class PetStore{
          // 父类的引用作为方法的返回值类型。
          public Pet getPet(int choose){
              if(choose == 1){
                  return new Dog();
              }else if(choose == 2){
                  return new Penguin();
              }else{
                  return null;
              }
          }
      }
      
    3. 编写测试类进行领养测试

      public class Test{
          public static void main(String[] args){
              PetStore petStore = new PetStore();
              // Pet pet = new Dog();
              Pet pet = petStore.getPet(1);
              pet.setName("小哈");
              pet.eat();
          }
      }
      

3. 关键词 instanceof

判断某个对象是否是某个类型的实例。

语法:对象名 instanceof 类型

4. 向上类型转型和向下类型转型

之所以要进行类型转换,原因就是因为父类的引用无法访问子类特有的内容,所以才需要进行转换。

**类型转换:**强制类型转换 和 自动类型转换

  1. **自动类型转换:**Pet pet = new Dog(); // double num = 10;
  2. **强制类型转换:**Dog dog = (Dog)pet; // int num = (int)10.1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态介绍。 的相关文章

  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • “未找到 JAVA 路径。请检查 JAVA 是否已安装。”初始化 RSelenium 时出错

    我正在尝试启动一个 RSelenium 会话到 webscrape 但是 当运行此代码时 driver lt rsDriver browser c chrome chromever 76 0 3809 126 port 4444L 我收到此
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • RabbitMQ中重试机制的坑

    当我们消息消费失败的时候 可以进行重试 虽然SpringAMQP集成了retry机制 但是发现使用过程有点坑 等会细说 重试机制使用场景 1 如果是业务代码 比如空指针之类的异常那重试机制其实没什么用 2 如果是调用第三方系统 网络抖动之类
  • 二叉树遍历的非递归算法

    非递归的算法主要采用的是循环出栈入栈来实现对二叉树的遍历 下面是过程分析 以下列二叉树为例 图片来自懒猫老师 数据结构 课程相关内容 1 前序遍历 前序遍历的顺序为 根结点 gt 左子树 gt 右子树 基本过程 1 访问根结点 将根结点入栈
  • apply函数族简介

    apply函数 沿着数组的某一维度处理数据 例如 将函数用于矩阵的行或列 虽然与for while循环的效率相似 但只用一句话就可以完成 参数 apply 数组 维度 函数 函数名 x lt matrix 1 16 4 4 apply x
  • Java 基础 —— NIO 学习

    一 NIO 简介 java nio 全称 java non blocking IO 是指 JDK 提供的新 API 从 JDK1 4 开始 Java 提供了一系列改进的输入 输出的新特性 被统称为 NIO 即 New IO 新增了许多用于处
  • 95-38-040-Buffer-AbstractReferenceCountedByteBuf引用计数

    文章目录 1 总述 1 1 拓扑图 1 2 概述 2 私有变量 3 增加引用计数 4 减少引用计数 1 总述 1 1 拓扑图 1 2 概述 从名字可以推断 该抽象类实现引用计数相关的功能 引用计数的功能简单理解就是 x
  • 西安高新第三中学2021年高考成绩查询,西安高新三中的实力怎么样?让我们来看看这些数据……...

    有家长问 西安高新三中的升学率 到底是多少 可以考上五大又有多少个 先看参加中考的初中部 1 重点班和研讨班55 普通班35 别指望着公办初中的升学率超过60 数据很真实 残酷 2 去年高新三中定向生名额62个 其中高新一中给了5个 铁一中
  • python软件下载3版本-Python 3.7.2和3.6.8版本发布下载,附更新说明

    Python 3 7 2和Python 3 6 8版本发布了 支持Windows Linux UNIX Mac OS平台 已经提供Python 3 7 2 tgz和Python 3 6 8 tgz包下载 说明 Python 3 7 2属于P
  • 如何在右键新建中添加新建xmind文件

    如何在右键新建中添加新建xmind文件 导语 现在总是要写思维导图 所以希望新建的时候更方便快捷一点 不用打开软件新建才能选择新建文件之后文件的位置 于是就开始想能不能想Word文档一样直接鼠标右键新建处就可以有新建Word文档那样 方便的
  • KMP算法-时间复杂度分析

    KMP算法 假设m为模式串strM的长度 n为待匹配的字符串strN的长度 KMP的基本过程 求模式串strM的next数组 遍历比较待匹配的字符串strN 过程 遍历strN 遍历时出现strM j 的回跳 比较strN i strM j
  • 闲聊ROOT权限——ROOT权限的前世今生

    最近工作一直很忙 竟然慢慢地疏远了CSDN的博客 然而在工作中遇到问题 又会被多次的引导至CSDN 故笔者抽空也将自己学习的成果与大家分享在这里 希望能帮助到需要帮助的人 本文将从几个方面 由浅至深地讲述ROOT到底是什么东西 一 ROOT
  • python2.x脚本转换为python3.x脚本方法详细步骤与实践分享

    1 安装python3 x 2 设置python环境变更 将C Python36 Scripts C Python36 追加加到系统变更PATH中 注 C Python36为安装路径 若不一致请更换成你的安装路径 3 找到2to3 py脚本
  • java环境能加快matlab运行吗,花了一天,解决java调用matlab

    鉴于labview做不了web labview强项在于硬件仪器控制 可能也可以做web 还不会 虽然有web发布工具 但是基于远程前面板 最后效果都呈现在前面板上 涉及了跳转页面 matlab绘图等只在服务器端上显示的问题 因此 打算用ja
  • 支付通道简述

    1 苹果内购流程图 官方文档 简体中文文档 Apple Developer 苹果内购没有通知 需要前端调用后端接口 通知后端支付成功 订单号由前端提供 后端通过订单号处理业务逻辑 返回值示例 苹果服务器验证后的返回值文档地址 respons
  • js写一个简单的计算机,js实现一个简易计算器

    本文实例为大家分享了JS实现简易计算器的具体代码 供大家参考 具体内容如下14th test 这是一个标题 以下是一个简易计算器 第一个数 第二个数 var res 保存计算结果 function add var first documen
  • linux动态链接库的编译和使用

    文章目录 1 动态链接库的编译 2 可执行程序的编译 3 运行可执行程序 4 设置动态库查询目录 方法一 更改环境变量LD LIBRARY PATH 方法二 通过 Wl rpath编译链接选项指定 方法三 修改配置文件 etc ld so
  • 互联网企业使用云计算,有什么优势?

    现如今 上云已经成为企业发展过程中不可逆转的历史潮流趋势 如今 越来越多的企业开始采用云计算 因为它会给企业带来很多惊人的好处 云计算不仅可以降低企业成本 提高灵活性和弹性 还能优化资源的利用 从而提企业高竞争力 自动软件更新 许多公司及其
  • 2021.08.28-MMsegmentation0.16.0+Cuda10.1+Ubuntu16.04+Pytorch1.8环境安装

    个人在目标检测方向的学习比较深入 但在深度学习的图像处理中 语义分割也是一个很重要的方向 所以也想一探究竟 熟悉一下基本流程和工作原理 现打算在LINUX系统Ubuntu16 04上安装mmsegmentation框架 因为之前主要使用mm
  • 百度地图JavaScript API开发GIS服务

    百度地图JavaScript API是由JavaScript语言编写的应用程序接口 支持HTTP和HTTPS 免费对外开放 在使用前 需先申请密钥 ak 才可使用 主要分为两种类型的版本 JavaScript API GL 使用了WebGL
  • map erase 内存释放问题

    资料出处 http www cnblogs com goodness archive 2012 05 16 2503832 html 研究了下c 中map的内存占用情况 很多人说map中的erase以及clear不能释放内存 这几天实验了下
  • 多态介绍。

    Override 规范上 推荐加上 帮你校验是否是方法重写 方法重写在子类继承了父类的方法之后 如果发现在当前的需求下 父类的方法不够强大 所以在子类中就可以对此方法进行重写 特点 1 方法名相同 2 参数列表相同 3 返回值类型不能大于父