[Java] 继承 和 多态(学习总结)

2023-05-16

目录

继承: 

一、继承主要表示概念层上的 is-a 的关系

二、什么是继承:

三、语法

四、继承方式:

五、访问权限

六、构造方法

七、父类的属性和方法的访问

八、重载和重写(前提是子类是有权限的)

九、执行顺序

多态:

一、多态实际上是一种向上转型

二、包含一切的隐式赋值

三、怎么访问

四、小结


继承: 

一、继承主要表示概念层上的 is-a 的关系

二、什么是继承:

举个例子: 类A(动物) -> 类B(猫) --类A 类B 之间有层级关系

类B 继承 类A 、类B 派生于 类A 、类B 扩展于 类A

类A : 父类 基类 超类

类B : 子类 派生类

三、语法

父类在语法上没有任何要求;子类 extends 父类 { ... }

四、继承方式:

一个类 有且只有一个父类 classA{ ... } 隐含继承自 Object类

五、访问权限

public > protected > 什么都不写 > private

如果父类的属性、方法权限是 private :子类没有权限使用;什么都不写:如果子类和父类是同一个包下的类,就有权限;protected:子类 和 父类在同一个包下就有权限;public 子类有权限

六、构造方法

在子类的构造方法中,必须显式或者隐式调用父类的构造方法(用super);

public class Derived extends Base {
    //子类的构造方法中必须先调用父类的构造方法(通过super关键字调用)
    //当子类和父类都是无参构造方法时,可以省略
    public Derived(int a) {
        super(a);
    }

    public Derived(String b) {
        super(b);
    }
}

当父类和子类都是无参构造方法时,super()可以省略

例外:如果父类有无参构造方法,子类的构造方法中,隐含着调用了父类的构造方法

七、父类的属性和方法的访问

通过 super 可以明确访问父类中的属性和方法(有访问权限的前提下)

Base { a;method(); }

D1 extends Base{
    a;  method();
    m2(){ a;  this.a;   super.a;   super.method;  }
}蓝色调用自己的 红色调用父类的

没有名称歧义时,直接通过 this 也可以

八、重载和重写(前提是子类是有权限的)

public class B{
    int add(int a, int b){ ... }
}

public class D extends B{
    double add(double a,double b){ ... }  //与class B 中的add互为重载关系 (overload)

    int add(int a,int b){ ... }      //与class B 中的add互为重写/覆写关系 (override)
}

@Override 明确该方法试图重写父类方法

MyRandom extends Random{

        @Override   //注解

        public int nextLnt(){ ... }

}

九、执行顺序

1.使用类之前,必须进行类的加载(类的初始化代码执行顺序)

   静态代码块 和 静态属性 按照代码书写顺序执行

2.对象实例时,必须进行对象的构造过程(隐含着,可能出现类的加载)

   构造代码块 和 属性 按照代码书写顺序执行

   构造方法执行

3.子类的加载之前,必须保证父类先加载完成(用到子类,隐含着用到父类)

4.子类的的对象构造之前,先把父类的对象构造完


多态:

一、多态实际上是一种向上转型

上级的引用可以指向下级的对象

    (上级)   Obiect -> Ancestor -> Grandpa -> Parent -> A   (下级)

A a = new A();        Parent p = new A();        Grandpa g = new A();        Ancestor a = new A();

Object o = new A();

二、包含一切的隐式赋值

①public void method(Ancestor an) { ... }

method( new A() );                      Ancestor an = new A();

②public Ancestor method() {

A a = new A();

return a;                                      Ancestor an = a;

}

③public A method() { ... }

Ancestor an = method();            Ancestor an = new A();

三、怎么访问

当存在普通方法重写时,即使在父类方法中调用 this.hello(),执行的哪个方法,和对象的类型有关(由于对象是D的对象,执行的是D对象的hello;)

public class B {
    public void method(){
        System.out.println("我是父类的 method");
        this.hello();
    }
    public void hello(){
        System.out.println("我是父类的 hello");
    }
}
public class D extends B {
    @Override
    public void hello() {
        System.out.println("我是子类的 hello");
    }
}
public class Use {
    public static void main(String[] args) {
        D d = new D();
        d.method();
    }
}

执行结果为:

 举个栗子:

B { a();   b(); }

D extends B{ b();     c();     d(); }

D d = new D();   d.a();      d.b();      d.c();      d.d();

B b = new B();    b.a();      b.b();执行的是D类中的b

能执行哪些功能(属性、方法),看引用类型;实际执行的是哪个功能,看对象类型

四、小结

class Animal { public int a;        public void method(){ ... } }

class Dog extends Animal { public int b;        public void otherMethod(){ ... };       

                                            public void method(){ ...重写了父类的方法... }

        1. Animal a = new Dog();      任何对象都可以被其上层引用指向(向上转型),向上转型是自然的;

         2.①能访问哪些属性,根据引用类型决定:a.a 对的;   a.method() 对的;   a.b 错的;  a.otherMethod(); 错的;

            ②真正执行的方法,由对象类型决定:a.method(); 真正执行的是Dog中的 method 方法,由于a 目前指向的对象是Dog 类型

        3.某些情况需要调用子类中的独有的某个方法时,必须向下转型,向下转型是不自然的,有风险的,例如:Dog d = (Dog)a;

        4.判断 -> Animal instanceof Dog -> 是 true 还是 false

        5.如果没有判断,有可能会发生异常ClassCastException 发生错误转换

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

[Java] 继承 和 多态(学习总结) 的相关文章

  • ros中无人机基于话题<geographic_msgs/GeoPoseStamped.h>的指点飞行控制

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 话题认识二 完整代码总结 前言 本篇文章是作者在学习ros时根据自己的认识所写的代码 xff0c 主要是基于话题 lt
  • Jmeter性能测试(24)--dubbo接口测试

    一 Dubbo简介 dubbo是一个分布式服务框架 xff0c 致力于提供高性能和透明化的RPC远程服务调用方案 xff0c 以及SOA服务治理方案 其核心部分包含如下几点 xff1a 1 远程通讯 xff1a 提供对多种基于长连接的NIO
  • 自定义mavlink及收发测试(px4固件V1.11.0,QGC源码4.0)

    一 实现收 1 先定义uORB消息 a01 GPS msg uint64 timestamp time since system start microseconds uint64 lat Latitude uint64 lon Longi
  • 自定义mavlink及收发测试2(px4固件V1.11.0,QGC源码V4.0)

    一 1 下载安装一个mavlink文件或者在原文件上修改 安装步骤 xff08 包含mavlink generator xff09 可参照文章 PX4自定义Mavlink消息 xff08 一 xff09 px4发送 Sense97的博客 C
  • Ubuntu20.04 | 更新软件源 sudo apt-get update 出现错误

    之前使用了清华的官方源 清华大学开源软件镜像站 Tsinghua Open Source Mirror 错误提示 xff1a 忽略 1 https mirrors tuna tsinghua edu cn ubuntu focal InRe
  • PCB封装库的制作

    以下几个元件制作为例 xff1a 元件SMA封装 步骤 xff1a 1 创建PCB库文件 xff1a 单击 File 菜单 xff0c 选择 New 选项中的 Library 选项 xff0c 再选择 PCB Library xff0c 进
  • PCB板自动布线

    自动布线 步骤 xff1a 1 整体删除同层的走线 xff1a 打开PCB文件 xff0c 在层的选项卡中选择顶层 Top Layer xff0c 在 Edit 菜单下选择 Select 选项 xff0c 选择 All on Layer 选
  • 独立按键实验

    按键简介 按键是一种电子开关 xff0c 使用时 xff0c 按下按钮 xff0c 则开关接通 xff0c 松开手时 开关断开 开发板上使用的按键及内部简易图如下图所示 xff1a 按键管脚两端距离长的表示默认是导通状态 xff08 1 2
  • IO 扩展(串转并)-74HC595-16*16LED点阵实验

    51 单片机的IO 口非常有限 xff0c 有时候若想要连接更多外围设备 xff0c 需要通过 IO 扩展来实现 本文介绍一种 IO 口扩展方式 串转并 xff0c 使用的芯片是 74HC595 若有4个 74HC595 芯片 xff0c
  • LED 点阵实验~点亮一个点、数字、汉字、图

    LED 点阵简介 LED 点阵是由发光二极管排列组成的显示器件 xff0c 如下所示为8 8LED 点阵 xff1a 以 16 16LED 点阵为例 xff0c 其内部结构图如下所示 xff1a 16 16 点阵共由 256 个发光二极管组
  • 定时器中断

    定时器简介 介绍定时器之前 xff0c 先说明几个CPU 时序的有关知识 振荡周期 xff1a 为单片机提供定时信号的振荡源的周期状态周期 xff1a 1 个状态周期 61 2 个振荡周期机器周期 xff1a 1 个机器周期 61 6 个状
  • 红外遥控实验

    红外线简介 人眼所能看到的可见光 xff0c 按波长从长到短排列 xff0c 依次为红 xff08 660nm xff09 橙 xff08 610nm xff09 黄 xff08 585nm xff09 绿 xff08 555nm xff0
  • Jmeter性能测试(25)--linux环境运行jmeter并生成报告

    jmeter是一个java开发的利用多线程原理来模拟并发进行性能测试的工具 xff0c 一般来说 xff0c GUI模式只用于创建脚本以及用来debug xff0c 执行测试时建议使用非GUI模式运行 这篇博客 xff0c 介绍下在linu
  • 题目:输入三个整数x,y,z,把这三个数由小到大输出

    程序分析 xff1a 方式一 xff1a 先将两个数比较 xff0c 再将较大值与第三个数比较 xff0c 得到最大值 然后比较剩余的两个值 最后 xff0c 将数值以X lt Y lt Z的顺序输出 方式二 xff1a 将三个数分别两两进
  • 对话框QDialog

    对话框是 GUI 程序中不可或缺的组成部分 很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置 对话框通常会是一个顶层窗口 xff0c 出现在程序最上层 xff0c 用于实现短期任务或者简洁的用户交互 Qt 中使用QDialog类
  • 布局管理器~登录界面的搭建实例

    所谓的图形用户界面 xff08 GUI xff09 xff0c 本质上就是一堆组件的叠加 创建一个窗口 xff0c 把按钮放上面 xff0c 把图标放上面 xff0c 这样就成了一个界面 因此 xff0c 组件位置的放置尤其重要 xff0c
  • 常用控件及自定义控件

    QLabel QLabel可以用来显示文本 xff0c 图片和动画等 显示文本 xff08 普通文本 HTML xff09 通过QLabel类的setText函数设置显示的内容 void setText const QString amp
  • Dev-c++ 5.11版本调试方法(七小时折磨调试成功,超详细版)

    一 出现的问题是 1 设置断点之后点调试不出现蓝行 2 点了调试之后出现黑框 然后又闪退 3 添加查看之后也看不了变量的值 等等各种问题 xff08 查找 一个个试验 xff0c 还有整理 xff0c 花了起码六七小时 xff0c 几乎一天
  • Pycharm调试Debug篇(详细)

    pycharm中的debug模式 首先 xff0c 还是用示例说话 xff0c 我们书写一段简短的代码 xff0c 来帮我们完成今天要讲的内容 def sum demo x y for in range 2 x 43 61 1 y 43 6
  • Qt --- 信号与槽

    信号与槽概述 信号与槽是 Qt 框架引以为豪的机制之一 所谓信号与槽 xff0c 实际就是观察者模式 发布 订阅模式 当某个事件发生之后 xff0c 比如 xff0c 按钮检测到自己被点击了一下 xff0c 它就会发出一个信号 xff08

随机推荐

  • 不可不知道的串口常识

    串口 xff1a 串口是一个泛称 xff0c UART xff0c TTL xff0c RS232 xff0c RS485都遵循类似的通信时序协议 xff0c 因此都被通称为串口 串口 UART口 COM xff08 cluster com
  • 【Linux】磁盘分区和挂载

    目录 Linux磁盘分区和挂载 linux分区 查看所有设备挂载情况 挂载案例 步骤1 xff1a 新建一块硬盘 操作步骤2 xff1a 虚拟机硬盘分区 步骤3 xff1a 虚拟机硬盘分区格式化 步骤4 xff1a 将磁盘挂载到根目录下ne
  • RealSense D435i + imu 标定 Ros Melodic

    准备工作 ubuntu ros melodic环境 librealsense realsense ros 一 修改rs camera launch文件中的参数 修改之前装好的realsense环境中的 src realsense ros r
  • Jmeter性能测试(26)---生成HTML性能测试报告

    性能测试工具Jmeter由于其体积小 使用方便 学习成本低等原因 xff0c 在现在的性能测试过程中 xff0c 使用率越来越高 xff0c 但其本身也有一定的缺点 xff0c 比如提供的测试结果可视化做的很一般 不过从3 0版本开始 xf
  • 【mcuclub】时钟模块DS1302

    一 实物图 二 原理图 编号名称功能1VCC2双供电配置中的主电源供应引脚 DS1302工作于 VCC1和VCC2中较大者 当VCC2比VCC1高0 2V 时 xff0c VCC2 给 DS1302供电 当VCC1比VCC2高时 VCC1给
  • 【mcuclub】定时器/计数器

    一 简介 定时器实际上就是Soc当中的一个内部外设 定时器常与计数器扯到一起 xff0c 计数器也是Soc当中的一个内部外设 xff0c 计数器顾名思义是用来计数的 xff0c 就和我们的秒表一样 xff0c 秒表实际上就是一个计数器 xf
  • 基于A*算法自动引导车的路径规划(Matlab代码实现)

    x1f4a5 x1f4a5 x1f49e x1f49e 欢迎来到本博客 x1f4a5 x1f4a5 x1f3c6 博主优势 xff1a x1f31e x1f31e x1f31e 博客内容尽量做到思维缜密 xff0c 逻辑清晰 xff0c 为
  • 【文章转载】使用常见Matlab工具箱调节pid参数(飞机垂直速度控制系统设计)

    申明 xff1a 这是一篇转载文章 xff0c 本人害怕原链接失效 xff0c 故转载 xff0c 没有商用 xff0c 作者也可也私我删除 使用常见Matlab工具箱调节pid参数 小白的第一篇知乎文章 xff0c 如果有不准确的地方 x
  • 制作自己的ORBSLAM2数据集,并实现三维重建(代码自己写的)

    2 ORBSLAM2 测试自己拍摄的数据集 使用手机 摄像机等设备拍摄视频 xff0c 对应我们只能使用单目 Monocular 2 1对相机标定 首先我们要对相机进行标定 xff0c 使用 MATLAB 里面的标定工具包 标定好之 后创建
  • c++的好处

    1 更新迭代慢 xff0c 技术成熟的很高 xff0c 基本不会有太大的改动 xff0c 工作后学习压力小 2 C C 43 43 是系统编程层级唯一的一门高级语言 xff0c 速度快 xff0c 效率高 不用担心今后会被取代 3 C C
  • lacp协议

    LACP xff08 Link Aggregation Control Protocol xff0c 链路聚合控制协议 xff09 将多条链路逻辑上模拟成一条链路 xff0c 以增加网络带宽 xff08 通常网络多条链路情况下 xff0c
  • Windows 10 下安装Linux

    使用Hype V 快速安装 选择的Ubuntu 22 04 LTS 安装一切正常 xff0c 登录提示 登录以后提示connecting to sesman ip 127 0 0 1 port 3350 关闭查看菜单的 增强模式 xff0c
  • mvvm是什么?

    1 总结 一句话总结 xff1a vm层 xff08 视图模型层 xff09 通过接口从后台m层 xff08 model层 xff09 请求数据 xff0c vm层继而和v view层 实现数据的双向绑定 2 mvc和mvvm的关系 xff
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • ubuntu 16.04版本安装docker以及创建docker容器

    一 简介 Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 容器是完全使用沙箱机制 xff0c
  • 字符串操作函数strstr

    目录 一 strstr函数介绍 二 strstr函数的模拟 三 代码实现 一 strstr函数介绍 在编写程序的过程中 xff0c 我们不可避免地会调用字符串操作函数 xff0c 今天要介绍的字符串操作函数是strstr函数 strstr函
  • 【无标题】前端工程师面试题手册-有点长但是很有用

    不是原作者 想想要获取更多前端开发相关学习资料 xff0c 请加微信1124692领取 前端工程师面试题手册 目录 1 前端基础 11 1 1 HTTP HTML 浏览器
  • 超详细的VMware虚拟机安装Linux图文教程保姆级

    目录 一 下载VMware 二 安装VMware 三 下载Linux 四 安装Linux 五 设置本地机与虚拟机之间的数据传输 xff08 复制 粘贴等操作 xff09 一 下载VMware VMware官网有两个版本 xff0c 分别是
  • 仿牛客技术博客项目常见问题及解答(三)

    书接上回 xff1a 仿牛客技术博客项目常见问题及解答 xff08 二 xff09 李孛欢的博客 CSDN博客 13 项目中的kafka是怎么用的 xff1f kafka入门 Apache Kafka是一个分布式流平台 一个分布式的流平台应
  • [Java] 继承 和 多态(学习总结)

    目录 继承 一 继承主要表示概念层上的 is a 的关系 二 什么是继承 三 语法 四 继承方式 xff1a 五 访问权限 六 构造方法 七 父类的属性和方法的访问 八 重载和重写 xff08 前提是子类是有权限的 xff09 九 执行顺序