什么是继承,向上下转型,多态?

硬件笔记——HDMI接口 HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。 阅读详情

简介

继承?向上下转型?多态?,都是什么鬼,其实三者是有联系的,终于理解清楚了

什么是继承

继承是用来表示类之间的 is-a 关系:狗是动物,电脑是机器

继承的分类

1.单继承

2.多继承

​ 一个子类可以继承多个父类,比如猫即使猫科动物,也是哺乳动物

Java是支持单继承的

继承解决了什么问题?

假如两个类有一些相同的属性和方法,我们就可以将这些相同的部分,抽取到父类中,让两个子类继承父类。

这样,两个子类就可以重用父类中的代码,避免代码重复写多遍

1.减少重复代码

2.从设计的角度来说,也有一种结构美感(艺术感)

​ 人类认知的角度上来说,是一种 is-a 关系。我们通过继承来关联两个类,反应真实世界中的这种关系,非常符合人类的认知

继承的缺点

过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差。
为了了解一个类的功能,我们不仅需要查看这个类的代码,还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。
还有,子类和父类高度耦合,修改父类的代码,会直接影响到子类

为什么Java只支持单继承

为什么类是单继承的?如果类是多继承的,且两个父类中都实现了init()方法,

子类在调用时存在调用的不确定性(不知道调用哪个类的init()方法)。

继承的代码探索

上面都是里面,下面是实战,根据代码来探索Java 继承的特性

父类: Animal

package p2.code.obj.lab_05_03.extendHello;

import p2.code.obj.lab_05_02.Main;

/**
 * @Author: wuyuhong
 * @Date: 2021/11/26 - 11 - 26 - 9:16 下午
 * @Description: p2.code.obj.lab_05_03.extendHello
 * @Version: 1.0
 */
public class Animal {
    public String name="动物";
    public boolean canRun;
    public Animal(){
        System.out.println("父类-->构造方法执行");
    }
    public Animal(boolean canRun){
        this.canRun=canRun;
        System.out.println("父类-->有参构造执行");
    }
    public void sayHi(){
        System.out.println("Animal Hi");
    }
    private void sayHello(){
        System.out.println("Animal hello");
    }
    public void sayOMG(){
        System.out.println("Animal Oh MY GOD");
    }

    public static void main(String[] args) {
        Animal animal=new Animal();
        animal.sayHello(); // 私有方法只能在类内部能访问
    }
}

子类:

package p2.code.obj.lab_05_03.extendHello;

/**
 * @Author: wuyuhong
 * @Date: 2021/11/26 - 11 - 26 - 9:17 下午
 * @Description: p2.code.obj.lab_05_03.extendHello
 * @Version: 1.0
 */
public class Dog extends Animal{
    private String name = "dog"; // 当父类属性和子类属性相同时,当子类被调用,会使用子类自己的属性
    // public String name = "小狗";

    public Dog() {
        // 不写super(); 当创建Dog对象时,默认会执行父类构造函数
        // super();    // 只能执行一个父类构造函数,不能即执行super(),又执行super(true);
        super(true);
    }
    public void helloFunc(){
        super.sayHi(); // 可以使用super调用父类方法,假设sayHi被重写,则可以使用super这种方式来调用父类的方法
        System.out.println(super.name); // 可以是使用super的方式访问父类属性。假设父类属性被重写
        // 也可以修改父类的属性
        super.name="Animal";
    }

    @Override
    public void sayOMG() {
        System.out.println("wang~ oh my god");
    }


    private void sayYYDS(){
        System.out.println("yyds");
    }

    public static void main(String[] args) {
        Dog dog=new Dog();
        System.out.println(dog.name);
        dog.helloFunc();
        dog.sayHi(); // 可以直接调用父类的方法(前提是父类的方法是public 或protected),
        dog.sayOMG(); // 假设sayHi被重写,那么子类调用自身被重写的方法

       

    }
   


}

子类的创建
 public Dog() {
        // 不写super(); 当创建Dog对象时,默认会执行父类构造函数
        // super();    // 只能执行一个父类构造函数,不能即执行super(),又执行super(true);
        super(true);
 }

当创建Dog对象时,默认会执行父类构造函数,然后拥有父类公开的属性

只能执行一个父类构造函数,不能即执行super(),又执行super(true);

super关键字
   public void helloFunc(){
        super.sayHi(); // 可以使用super调用父类方法,假设sayHi被重写,则可以使用super这种方式来调用父类的方法
        System.out.println(super.name); // 可以是使用super的方式访问父类属性。假设父类属性被重写
        // 也可以修改父类的属性
        super.name="Animal";
    }

super.sayHi(); 可以使用super调用父类方法,假设sayHi被重写,则可以使用super这种方式来调用父类的方法

System.out.println(super.name); 可以是使用super的方式访问父类属性。假设父类属性被重写

super.name=“Animal”; 可以修改父类的属性

子类的重写

重写属性:

 private String name = "dog"; // 当父类属性和子类属性相同时,当子类被调用,会使用子类自己的属性
    // public String name = "小狗";

重写方法

  @Override
    public void sayOMG() {
        System.out.println("wang~ oh my god");
    }
创建子类对象时,JVM创建了几个对象

即然子类被创建会调用父类的构造方法super(),那么当子类被创建时,JVM创建了几个对象?
答案是一个,只是在子类构造中调用了父类的构造函数,并没有同时创建父类对象

怎么验证呢?可以看字节码指令来验证

在这里插入图片描述

子类创建后的使用
 Dog dog=new Dog();
 System.out.println(dog.name);
        dog.helloFunc();
        dog.sayHi(); // 可以直接调用父类的方法(前提是父类的方法是public 或protected),
        dog.sayOMG(); // 假设sayHi被重写,那么子类调用自身被重写的方法

​ dog.sayHi(); // 可以直接调用父类的方法(前提是父类的方法是public 或protected),

​ dog.sayOMG(); // 假设sayHi被重写,那么子类调用自身被重写的方法

向上、向下转型

// 向上转型: 子类对象转化为父类对象 向上转型是多态的基础

Animal bigDog=new Dog();
System.out.println(bigDog.canRun);

bigDog.helloFunc(); 虽然helloFunc是public的,但是向上转型后还是不能访问

总结: 因此向上转型后,对象bigDog 只能访问父类和子类公共的方法和属性

// 向下转型:父类对象转化为子类对象

​ 安全的向下转型 :父类引用指向子类对象

        
        Animal dog1=new Dog();
        Dog animal1=(Dog) dog1;
        animal1.sayHi();

// 不安全的向下转型

      Animal animal2=new Animal();
        //Dog dog2=(Dog)animal2;
        // 编译无错,运行时报错 Exception in thread "main" java.lang.ClassCastException:
    
// 这样编译就不会报错
    if(animal2 instanceof Dog){
        Dog dog2=(Dog)animal2;
        System.out.println("running ?");
        dog2.sayOMG();
    }

多态

多态的定义是什么

子类可以替换父类

为什么子类能替换父类?

​ 因为子类替换父类后,其实就是向上转型,取得是子类和父类的公共部分的交集

多态的条件

1.父类可以引用子类对象(父类其实引用的是子类和父类公共的部分,包括父类的方法)

2.子类重写父类的方法

package p2.code.obj.lab_05_03.extendHello;

import java.util.Date;

/**
 * @Author: wuyuhong
 * @Date: 2021/11/27 - 11 - 27 - 2:30 下午
 * @Description: p2.code.obj.lab_05_03.extendHello
 * @Version: 1.0
 */
public class SoundCollector {

    public void say(Animal animal){
    animal.sayOMG();
    }

    public static void main(String[] args) {
     Animal dog=new Dog();
     Animal cat=new Cat();

     SoundCollector soundCollector=new SoundCollector();
     soundCollector.say(dog);
     soundCollector.say(cat);

     Dog dog1=new Dog();
     soundCollector.say(dog1);

    }
}

多态的好处

多态特性能提高代码的可扩展性和复用性

表示一类事物借助子类可以替换父类和子类可以重写父类方法的特性,所以作为封装方可以进行统一处理

​ for example: public void say(Animal animal)

既然子类可以替换父类(向上转型)
那么封装的方法say(Animal animal)就可以接收父类,来动态调用子类的方法

举个栗子:
say(Animal animal) 这个函数就像是面包机,你往say(Animal animal)中放水果,它就产出水果面包,
放肉松就产出肉松面包,放入的所有物品都是Food,Food为父类,你不可能放一个刀进去吧 哈哈哈

IEEE LaTeX模板中algorithm排版避坑指南:如何优雅地嵌入算法描述? 本文详细解析了在IEEE LaTeX模板中优雅排版algorithm的实用技巧,包括基础配置、高级自定义及常见问题解决方案。通过嵌套环境与[H]参数的应用,帮助研究者克服IEEEtran模板对算法排版的限制,实现专业且美观的算法呈现。 阅读详情

相关推荐

保姆级教程:用Python工具搞定MTK手机分区表(PGPT)备份与线刷引导文件生成

本文提供了一份详细的Python工具链教程,帮助用户备份MTK手机的PGPT分区表并生成线刷引导文件。内容涵盖环境配置、分区表解析、备份流程、线刷文件生成及常见问题排查,特别适合安卓玩机爱好者和开发者。通过本指南,读者可掌握MTK芯片设备的底层分区操作技术,实现安全高效的分区备份与恢复。

weixin_30394669的博客 189

继承多态和向下向上转型

继承和多态(向上转型、向下转型) 1 概念 1.1 继承 ​ 继承的基本思想是,可以基于已有的类创建新的类。继承已存在的类就是复用(继承)这些类的方法,而且可以增加一些新的方法和字段(成员变量),使新类能够适应新的情况。 1.2 多态 ​ 在Java核心技术卷 I 中有这样一段话:“对象变量是多态的。一个Employee(超类)类型的变量既可以引用一个Employee类型的对象,也可以引用Employee类的任何一个子类的对象(如:Manager、Executive、Secretary等)”。 ​ 上

梦中注定的博客 1052

深入解析WIFI与蓝牙模块电路设计:从原理到实战

本文深入解析了WIFI与蓝牙模块的电路设计,从核心原理到实战应用。文章以AP6256模块为例,详细拆解了电源树、时钟电路、接口设计及天线射频路径等关键环节,并提供了PCB布局布线的实用准则与调试方法,旨在帮助硬件工程师设计出稳定可靠的无线产品,规避常见陷阱。

weixin_29186249的博客 150

java中查看类向下和向上的继承关系的方式(非常有用)

在java开发过程,经常会遇到需要查看此类的继承关系的问题,那么在idea开发工具中有下面两种方法: 1、在类上查看hierarchy,打开hierarchy菜单,查看向下和向上的继承关系,或者记住快捷键,下次直接用,高效! 2、通过在打开的类文件中,点击右键,通过diagram,查看向上的继承关系;在结构图中通过按住alt或者option打开放大器,哈哈,挺好玩的! 3、额外:通过struct...

Mia的博客 989

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1634

FPGA面试题目笔记(一)——FPGA开发流程、亚稳态和竞争冒险、建立保持时间、异步FIFO深度等

同步异步电路、同步异步复位、时钟偏移和抖动、最小工作周期计算、触发器锁存器

H19981118的博客 1万+

继承 多态 向上转型 向下转型

多态是同一个行为具有多个不同表现形式或形态的能力。

s13057696399的博客 581

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

weixin_44119674的博客 440

C++学习之继承(一)

继承的概念 通过一种机制表达类型之间共性和特性方式,利用已有的数据类型定义的新的数据类型,这种机制就是继承。 子类(派生类)继承父类(基类) 继承的语法 class 子类:继承方式 基类1, 继承方式 基类2... ...{ ... }; 继承方式: 1)公有继承public 2)保护继承 protected 3)私有继承 private 公有继承的特性(public) 1)子类...

u013511885的博客 328

Unity 面试篇|(六)数据结构和算法篇 【全面总结 | 持续更新】

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样遍历完后,堆中的10000个数就是所需的最大的10000个。桶排序是计数排序的升级版。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出1000*10000中的最终的结果。

游戏开发小Y的博客 12万+

华为Ascend C算子开发能力认证(中级)(个人记录,有完整代码,已通过认证,仅供参考)

本文介绍了在昇腾NPU环境下实现Sigmoid算子的完整流程。首先需要在华为云ModelArts-Notebook或开发者套件上搭建环境,要求CANN版本为8.0.0.beta1。主要内容包括:1)实现SigmoidCustom算子的kernel侧核函数代码;2)完成host侧Tiling结构体实现;3)支持Float16数据类型。代码实现部分详细展示了核函数计算流程、数据拷贝和牛顿迭代优化方法。最后介绍了编译部署流程,包括环境配置、代码上传、编译执行等步骤,并提供了提交规范说明。该实现通过调用Ascend

qq_73044452的博客 1107

ObjectOrientedProgramming - 面向对象的编程(包、继承、多态的一部分:向下/向下转型,重写) -Java

文章目录包包 (package) 是组织类的一种方式.代码案例(打印数组):附图(缺少的那句代码,作用就是导入一个包。从包中拿出你需要的类)图1图2经由上面一个简单的程序附图2,引申出一格问题: 什么是 package 和 import?在java里,包肯定不止一个,那么就意味着 一个 类,可能有在不同包里都有它,只不过实现的功能不同。选择对应包中的类,编译器会自动帮你导入所需包中的类例1例2既然知道包是怎么导入它当中的类,那么该如何使用? new它!实例1(导入(包中的类)情况)实例2(不导入(包中的类)

DarkAndGrey的博客 3030

SAP Gateway 中事务码 /IWFND/MAINT_SERVICE 的用法介绍

本文系统梳理了SAP Gateway中/IWFND/MAINT_SERVICE事务码的核心功能与运维实践。作为OData服务管理中樞,它支持服务注册激活、ICF节点配置、系统别名绑定、批量处理等关键操作。文章详解了服务目录、ICF节点、系统别名的配置要点,提供了批量激活、缓存清理、性能监控等实用技巧,并针对常见陷阱(如传输配置、删除残留)给出解决方案。通过制造业批量激活、零售业OAuth集成等案例,展示了事务码在企业级应用中的实际价值,为SAP Gateway运维提供了一套完整的治理清单。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

继承、多态、向上转型、向下转型

继承和多态

qq_43243800的博客 1016

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多态性 继承 向上转型

多态的理解: 同一个事件发生在不同的对象上会产生不同的结果。 不同实列对象使用通过同一种方法而产生的不同的效果 存在条件: 继承 重写 父类的引用指向子类的对象 引用 https://blog.youkuaiyun.com/newchitu/article/details/90380094 ...

weixin_44895142的博客 217

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java复习5 继承、多态(向上、向下转型)、组合

Java

qq_51184727的博客 851

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Day8】继承与多态:extends、重写与向上转型的实际应用

  哈喽,各位 Java 学习者!欢迎来到《Java 学习日记》的第八篇内容~ 前七天我们掌握了类、对象、封装和构造方法,今天要攻克面向对象的另外两大核心特性 —— 继承与多态。继承让代码复用成为可能,多态让程序具备灵活的扩展能力,这两个特性是大型项目 “高内聚、低耦合” 的核心保障。本文会从继承的基本用法、方法重写,到多态的实现(向上转型),结合大量实战案例,帮你理解继承与多态的实际应用场景!

maihuohuo的博客 1079

C# 继承、多态、向上、向下转型、接口的联系

接口与继承有着密切的关系,类可以实现一个或多个接口,从而继承接口中定义的方法。接口的使用与多态密切相关,通过接口类型的引用,我们可以实现运行时多态,调用实现该接口的类的具体方法。是多态的补充和扩展。多态的实现依赖于向上转型,通过向上转型,我们可以将派生类对象赋值给基类引用,从而可以使用基类引用来调用子类的方法。通过将派生类对象转换为基类引用,我们可以利用基类引用来统一处理不同类型的对象,实现了代码的灵活性和扩展性。向上转型是安全的,因为派生类对象总是可以赋值给基类引用,并且运行时将自动调用相应子类的实现。

語衣的个人博客 608

继承、重写、向上转型、动态绑定、多态知识层级梳理

本文详细讲解Java面向对象核心重难点:继承、方法重写、向上转型、动态绑定、多态、向下转型。清晰梳理各知识点的先后依赖关系,点明继承是多态的基础,讲解多态的实现三大条件、动态绑定底层机制、静态与动态绑定区别,区分重载与重写易混点,同时总结转型用法、适用场景和高频易错考点,适合零基础吃透Java多态全部必考内容。

2401_87925482的博客 387

Java面向对象:多态——基于继承的向上转型、方法重写、动态绑定

Java面向对象:多态1.多态的概念2.向上转型和向下转型3.方法重写4.动态绑定

weixin_47921628的博客 794

深入理解Java中的继承与多态(包括向上、向下转型)

继承 语法结构:class 子类名称 extends 父类名称 { } 子类继承了父类除构造方法以外所有的。例如: class Animals{ String name; int age; void eat(){ System.out.println("Animals:eat()"); } } class cat extends Animals{ } //cat作为animals的子类,就继承了父类的name、age属性和eat()方法。 注:如果父类中有私有的属性或行为,子类也会继承,只

Darling_sheeps的博客 585

【多态和继承应用】之向上转型和向下转型 instanceof的使用

通过使用 instanceof 进行类型检查,然后使用类型转换将 A 类型的引用 a 转换为 B 类型的引用 b,然后就可以通过 b.name 访问 B 类型中的属性值了。例如,一个通用的按钮接口可以有不同的实现类,通过向上转型,可以使用通用的按钮接口引用不同类型的按钮。通过定义通用的插件接口或基类,系统可以以通用的方式处理不同类型的插件,而不需要知道具体的插件类型。当一个方法的返回类型声明为父类类型,但实际上返回的是子类的实例时,可以利用多态性返回更具体的子类实例。

代码的魅力,根本走不出来 527

Java多态、接口继承、抽象类继承、向上向下转型实例

------------------------------------------- 关于多态、接口继承、抽象类继承等实例 1、通过多态,抽象类也可以被实现 2、通过多态,接口也可以被实现 3、向上转型、向下转型需要注意的事情 ------------------------------------------- package com.company; public class duoTai{ public static void main(String[] args){ //

qq_41733487的博客 364

继承、重写、重载、 abstract 抽象、 final、向上(向下)转型、多态

继承 父类:公共的属性和方法 子类:特有的属性和方法 重写 override: 1、继承 2、子类拥有和父类的一样的方法 方法名相同 参数列表相同 返回值类型可以缩小 访问控制权限可以方法 可声明的异常。。 重载:overload 1个类中,方法名相同,参数列表不同 与返回值类型,访问...

qq_52253798的博客 219

面向对象多态性中类的继承,方法重写,以及向下向上转型的理解。

自我理解吧 子类构造器的中的父类构造器要放在首行,如果不显示调用父类构造器,则默认调用父类构造器的空参构造器super(形参列表)。 所谓继承就是造类的时候继承一下 class Student extends Person 然后类Student就继承了它的父类Person的所有属性和方法。private的属性和方法也继承了但是不能直接调用,意思就是只是拥有无法使用而已,这个时候可以设置get set方法间接调用其属性,或者将私有方法嵌套在公开方法中调用。 重写操作,(一般都是与父类方法的格式一致,权限修饰符

qq_53049771的博客 177

【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

–本文摘要–     1、本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承、抽象类、接口、多态等等概念搞不清的初学者。     2、本文的内容摘要:讲述Java中的一些易混概念,static关键字、继承、重载、重写、多态、抽象类、接口、final关键字。     【版权声明】归优快云账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采集或.

十一月廿七风雨大作 1万+
上一篇: 什么是抽象?
下一篇: 程序员命名缩写
code222vip
博客等级 码龄12年 33粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值