OOP面向对象(继承,方法重写/覆盖,多态,instanceof运算符)2021-07-19java学习日记

2023-11-17

(7.19java学习日记)

7.19日 java基础p 436 - p460
学习时间:7 小时
关键词: OOP extends继承 方法覆盖/重写 多态 运算符instanceof

面向对象中的继承:

extends 只可以继承一个类,不支持多继承,继承之后,父类中用的方法子类都会有。(构造方法除外)子类中无法直接访问父类的私有属性。如果没有extends的话,默认继承Object类
作用:
1.代码的复用
2.因为有了继承,所以才有后面的方法覆盖和多态机制
System.out.println()中,System.out指向的是一个对象,out是静态的变量
方法覆盖:在子类中重新写一个方法将父类的方法进行覆盖,比如重新写一个toString,如果是原来的toString输出的是 类名@十六进制
我们可以重写,让他输出对象的值
方法重载:在一个类中,方法名相同,方法参数的个数或类型不同,通过个数和类型的不同来区分不同的函数

方法重写:

在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。
子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。
在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
这样,就可以实现对父类方法的覆盖。如果子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?
此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。
如果要使用super关键字不一定非要在方法重写之后使用,也可以明确地表示某个方法是从父类中继承而来的。使用super只是更加明确的说,要从父类中查找,就不在子类查找了。

多态:

多种状态,编译和运行的有两个不同的状态
编译期:静态绑定
运行期:动态绑定
例如 Animal a = new Cat()
编译器发现a的类型是Animal 但是堆内存中真实的对象是Cat
多态的经典类型:父类型的引用指向子类型的对象
向上转型 子—>父
父类 s = new 子类()
此时类型是父类,但是实际堆中的内存的对象是子类
静态绑定的时候是以父类类型,但是动态执行的时候是子类
如果此时调用了一个子类重写的方法,那么此时运行便是子类的方法。
向下转型: 父---->子
语法:Bird b = (Bird)x;
当父类需要调用子类的特有的方法的时候,需要向下转型
具有风险性,强转后可能会导致:静态绑定可以通过,但是对象里面其实没有这个方法,因此运行时候会出现:类型转换异常java.lang.ClassCastException(非常经典,和空指针异常一样)
所以一般需要用运算符instanceof来判断,你到底是不是这个东西语法为:(c instanceof Cat)只可能为ture或者是false,所以此处需要使用if(c instanceof Cat)来判断如果是的话就执行。这个是为了规范,以及方便其他程序员调用这个方法,不会运行报错。
多态开发中的作用:
1.降低程序的耦合度,提升程序的扩展力
高手开发的时候,除了功能的实现,还要考虑扩展性,OCP,开闭原则,代码修改的越少越好,修改的越多,稳定性越差。
通过一个例子来看多态的作用:

//主人类	
public class Master {
    public void feed(Pet pet) {
    	pet.eat();
    }
}
//宠物类 此处的宠物也可以分开写,但是为了方便就都放在一起了

public class Pet {
    public void eat() {
    	
    }
}
class Dog extends Pet{
	public void eat() {
		System.out.println("狗狗在吃骨头,真香!!!");
	
}


}
class Cat extends Pet{
	public void eat() {
		System.out.println("猫咪在吃鱼,真美味!!!");
}
}
	class YingWu extends Pet{
		public void eat() {
			System.out.println("鹦鹉吃饲料,哈哈哈!!!");
		}
}
//最后写一个测试类
public class Test {
		public static void main(String[] args) {
			Master zhangsan = new Master();
			Dog zangAo = new Dog();
			zhangsan.feed(zangAo);
			Cat xiaoHua = new Cat();
			zhangsan.feed(xiaoHua);
			YingWu duoZui = new YingWu();
			zhangsan.feed(duoZui);
		}
	}


最后运行成功截图:
在这里插入图片描述

其中这里来看,子类的Cat,Dog,YingWu都继承了Pet方法,当调用的时候,便是多态,相当于Pet pet = new Dog(),因此你调用哪一个宠物类,那么就会输出哪一个宠物的eat方法,这样来写的话,Master类便不用修改,如果有一个新的宠物类加入的话,只需要加一个类,然后重写eat方法即可。对扩展开放,对修改关闭,符合开闭原则OCP
面向对象的三大特征:
封装,继承,多态 真是一环扣一环
有了封装,有了这种整体的概念之后,对象和对象之间产生了继承
有了继承之后,才有了方法的覆盖和多态。
方法重写之后,更好用到多态,如果使用一个新的方法,那么只能调用这一个单独的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OOP面向对象(继承,方法重写/覆盖,多态,instanceof运算符)2021-07-19java学习日记 的相关文章

随机推荐

  • extern C 在c/c++中的使用

    http blog csdn net jscese article details 37821961 1 问题定义 在研究操作系统源代码或者在嵌入式系统中编写程序时 经常会发现下面这种用法 cpp view plain copy print
  • 引入UnityEngine.dll中的巨坑

    正确路径 C Program Files Unity Editor Data Managed 此目录下只需引用UnityEngine dll就可以访问MonoBehaviour 其他路径 C Program Files Unity Edit
  • compose配置文件参数详解

    本文介绍compose配置文件参数的使用 熟练编写compose文件 root docker lnmp cat lnmp yaml version 3 services nginx build root docker demo nginx
  • js之forEach怎么跳出循环

    第一种 跳出此次循环 1 2 3 4 5 6 forEach e gt if e 2 return false console log e 第二种 中断循环 1 2 3 4 5 6 forEach e gt if e 2 throw 抛出异
  • Elasticsearch入门

    下载地址 Download Elasticsearch Elastic 浏览器查看启动情况 出现一下内容说明服务已启动 如果启动成功无法访问 打开如图文件 将xpack security enabled 和xpack security ht
  • 详解mybatis的配置setMapperLocations多个路径两种方法

    文章目录 一 配置文件方式 二 Javabean配置 前言 我们在平常工作中用到mybatis去加载Mapper xml文件 可能mapper文件放的路径不一样 由此我们需要配置多个路径 幸运的是Mybatis支持我们配置多个不同路径 现在
  • Systick_Handler B.卡死处理方法

    Systick Handler B 卡死处理方法 注 鄙人在学习国产GD32芯片和STM32芯片做嵌入式时候出现过单片机卡死在 s启动文件Systick Handler B 处 现做系列总结 文章目录 1 中断开启未处理 2 引入C C 代
  • CentOS7.5离线安装jdk1.8

    目录 前言 一 环境准备 1 1 CentOS的安装 1 2 安装前检查是否有残余JDK 二 安装配置JDK 2 1 安装 2 2 修改配置文件 2 3 修改文件夹名称和脚本对应上 正常不需要操作 该步骤是方便以后部署使用脚本 前言 由于每
  • k8s笔记25--k8s 跨主机网络flannel

    k8s笔记25 k8s 跨主机网络flannel 简介 不同机器上网络设备区别 flannel 网络常见三大后端模式 UDP VXLAN host gw 如何查看集群用哪种网络模式 阿里云flannel容器网络 alloc 参考文档 简介
  • 解决IDEA中:Error running Tomcat8: Address localhost:1099 is already in use

    今天在运行Web项目的时候 突然运行不起来 最后报Error running Tomcat8 Address localhost 1099 is already in use 从而致web项目无法运行 看了一下原来是1099端口被占用 解决
  • PyTorch3D 安装记录

    1 PyTorch 安装 PyTorch 官网 PyTorch 官网 最新版本的 PyTorch 最新版本的 PyTorch 以 cuda 11 3 Python 3 9 Pytorch 1 12 1 为例 conda 安装 conda i
  • 端口重复处理

    不废话上代码之 端口重复处理 Description Web server failed to start Port 8080 was already in use Action Identify and stop the process
  • fragment嵌套viewpager嵌套fragment第二次加载数据不显示问题

    这几天做项目遇到一个问题 就是有这么一个页面是activity嵌套一个fragment1然后fragment1里放了一个viewpager viewpager里放了几个fragment 本来只有这么一个页面 显示出来也没什么问题 现在加新需
  • [架构之路-207]- 人人都是产品经理 - 常见的需求分析技术:实用的需求分析与建模详解过程(实操性强)

    目录 1 1 需求分析建模的要点与误区 1 1 1 需求分析到底做什么 1 1 1 1 分解的方法 1 1 1 2 提炼 合并 重组 1 1 1 3 消除矛盾 1 1 2 建模的目标和要点 1 1 2 1 建模的目的 1 1 2 2 建模的
  • 请问肾阴虚吃什么药?饮食注意什么?还有桂附地黄丸是治肾阴虚还是治肾阳虚的?谢谢

    如果确属肾阴虚当用 六味地黄丸 但肾阴虚那么多的特征里 最为明显的就是 夜间盗汗 如果不能确定 还是改用 桂附地黄丸 在 六味 的基础上加了 肉桂 与 附子 两味温药 作用就是在滋阴的基础上 温补肾阳 适宜平补 即 阴阳双补 最适宜服用的季
  • 揭秘区块链的核心技术之「哈希与加密算法 」

    大家都知道 区块链的关键技术组成主要为 P2P网络协议 共识机制 密码学技术 账户与存储模型 而这些技术中 又以 密码学与共识机制 这两点为最核心 那么今天我们来详细的聊一聊密码学 看一看密码学技术是如何在区块链中应用的 首先 我们需知道区
  • 完整版彻底卸载SQL Server2019

    首先我是因为SQL Server2019突然出现了一些问题然后重新安装了 简直被这个软件整的没脾气 希望我写的这个能帮助曾经和我一样被SQL Server卸载折磨得要疯的人 我是总结了很多前辈写的 然后重新安装SQL Server成功了 希
  • javase学习笔记

    01 01 计算机基础知识 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设备 由硬件和软件所组成 没有安装
  • jdk8源码之Queue-ArrayQueue

    关于队列这个数据结构 大家应该都是比较熟悉 列队是一种先进先出 FIFO 的数据结构 删除操作只能在表的头部 插入操作只能在表的尾部 Queue一般是作为一个缓冲队列使用的 简单举例 生产端的生产速度偶尔会大于消费端的消费速度 但又不想等待
  • OOP面向对象(继承,方法重写/覆盖,多态,instanceof运算符)2021-07-19java学习日记

    7 19java学习日记 7 19日 java基础p 436 p460 学习时间 7 小时 关键词 OOP extends继承 方法覆盖 重写 多态 运算符instanceof 面向对象中的继承 extends 只可以继承一个类 不支持多继