java学习(十)继承extends、方法覆盖、多态

Java、C#与C++在继承、覆盖、多态及抽象类中的特性对比分析 在现代软件工程中,面向对象编程(OOP)已成为主流的程序设计范式。其四大基本特征——封装、继承、多态与抽象,构成了构建可维护、可扩展系统的基础。要素语法符号是否必需作用继承关键字extends是声明类继承关系访问控制publicprotected/ 默认 /private否(默认包内可见)控制成员可访问范围方法重写@Override否(推荐使用)提供编译时校验,增强代码健壮性构造器链调用super(...) 阅读详情

java学习(十)继承extends、方法覆盖、多态

继承语法

class 类名 extends 父类名{

​ 类体;

}

  • java中规定,子类继承父类,除构造方法不能继承之外,剩下的都可以继承。但是private修饰的私有属性无法在子类中直接访问。

     

方法覆盖:重写父类方法

  • 中国人和美国人都继承人类,中国人调用打招呼希望输出“你好”,但是美国人调用打招呼希望输出“hi,hello”,这时候人类的到招呼方法就不满足需要了,需要方法覆盖。其实就是重写了父类方法。

代码:

public class People{
    private String name;
​
​
    public String getName(){
        return name;
    }
​
    public void setName(String name){
        this.name = name;
    }
    
    //定义一个方法
    public void speakHi(){
        System.out.println(this.name + "打个招呼");
    }
​
}
public class ChinesePeople extends People{
    
    public void speakHi(){
    
        System.out.println("你好,我是 " + this.getName() + ",认识你很高兴");
​
    }
}
public class AmericaPeople extends People{
    
    public void speakHi(){
    
        System.out.println("Hi,My name is:" + this.getName() + ",nice to meet you");
​
    }
}
public class PeopleTest {
    public static void main(String[] args) {
        ChinesePeople cp = new ChinesePeople();
        cp.setName("法外狂徒张三");
        cp.speakHi();
​
        AmericaPeople ap = new AmericaPeople();
        ap.setName("tony");
        ap.speakHi();
    }
}

 

多态:其实就是同一个行为发生在不同的对象上会有不同的效果。

看Test01和Test02代码

public class  Animal{
    public  void move(){
        System.out.println("动物会移动");
    }   
}
public class Cat extends Animal{
​
    //方法覆盖
    public void move(){
        System.out.println("猫会跑的!");
    }
​
    //猫特有方法
​
    public void catchMouse(){
​
        System.out.println("猫可抓老鼠!");
​
    }
}
public class Bird extends Animal{
    
    
    //方法覆盖
    public void move(){
​
        System.out.println("鸟会动的!");
    }
    
    //鸟特有的方法
    public void fly(){
        
        System.out.println("鸟飞了飞了!");
    }
}

Test01.java:

public class Test01 {
    public static void main(String[] args) {
        //创建 Animal 对象
        Animal a = new Animal();
        a.move();
        //创建 Cat 对象
        Cat c = new Cat();
        c.move();
        c.catchMouse();
        //创建鸟儿对象
        Bird b = new Bird();
        b.move();
        b.fly();
    }
}

Test02.java:

public class Test02{
    public static void main(String[] args) 
    {
        //向上转型
        Animal a1 = new Cat();
        a1.move();
        
        //向上转型
        Animal a2 = new Bird();
        a2.move();
    }
}

​ 解释:在编译阶段编译 器只知道 a1 变量的数据类型是 Animal,那么此时编译器会去 Animal.class字节码中查找 move() 方法,发现 Animal.class 字节码中存在 move()方法,然后将该 move()方法绑定到 a1 引用上, 编译通过了,这个过程我们可以理解为“静态绑定”阶段完成了。紧接着程序开始运行,进入 运行阶段,在运行的时候实际上在堆内存中 new的对象是 Cat 类型,也就是说真正在 move 移 动的时候,是 Cat 猫对象在移动,所以运行的时候就会自动执行 Cat 类当中的 move()方法,这 个过程可以称为“动态绑定”。但无论是什么时候,必须先“静态绑定”成功之后才能进入“动 态绑定”阶段。

向上转型:自动类型转换

  • java 中之所以有多态机制,是因为 java 允许一个父类型的引用指向一个子类型的对象。 这种父类型引用指向了子类对象属于向上转型,或者叫自动类型转换

向下转型:强制类型转换

  • 如果想调用子类特有方法,就需要向下转型

public class Test04 {
    public static void main(String[] args) {
        //向上转型
        Animal a = new Cat();
        
        //a.catchMouse();  //编译报错
        
        //向下转型:为了调用子类对象特有的方法
        //强制类型转换将 Animal 类型的 a 引用转换成 Cat 类型的引用c
        Cat c = (Cat)a;
        c.catchMouse();
    }
}

上面代码a.catchMouse();为什么报错呢?

​ 那是因为“Animal a = new Cat();”在编译的时候,编译器只知道 a 变量的数据类型是 Animal,也就是说它只会去 Animal.class 字节码中查找 catchMouse()方法,结果没找到,自然“静态绑定”就失败了,编 译没有通过。就像以上描述的错误信息一样:在类型为 Animal 的变量 a 中找不到方法 catchMouse()。

类型转换异常

public class Test05 {
    public static void main(String[] args) {
        Animal a = new Bird();
        Cat c = (Cat)a;
    }
}

上述代码可以编译通过,原因是编译器只知道 a 变量是 Animal 类型,Animal 类和 Cat 类之间存在继承关系 ,所以可以进行向下转型 ,语法没问题,问题是运行的时候a引用指向实际是鸟啊,你强制转猫,就报错了。

运算符 instanceof:结果是布尔值,如果是true就可以转型,false就不可以转型。

instanceof 运算符 语法格式:

(引用 instanceof 类型)

代码:

public class Test05 {
    public static void main(String[] args) {
​
​
        Animal a = new Bird();
​
        if (a instanceof Cat){  //判断引用a是不是Cat类型
​
            Cat c = (Cat)a;
            c.catchMouse();
​
        }else if(a instanceof Bird){  //判断引用a是不是Bird类型
​
        
            Bird b = (Bird)a;
            b.fly();
        
        }
       
    }
}

其实多态存在的三个必要条件分别是:

① 继承

② 方法覆盖

③ 父类型引用指向子类型对象 ,子类将方法重写之后调用到子类对象上的 方法产生不同效果时,多态就形成了。

静态方法的“覆盖”是没有意义的,所以通常我们不谈静态方法的覆盖。

Win11用户文件夹中文名修改全攻略 本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。 阅读详情

相关推荐

车企常用架构、通信设计、需求管理工具全汇总

车辆技术是个系统工程,比较大,需要多人协作。“协作”往往需要工具参与,才能保证协作过程的高效、有条不紊。 【文章系转载,出处见图片水印】 今天我们就来捋一捋汽车行业常用的架构、网络开发工具~ Preevision 大名鼎鼎的Preevision,来自大名鼎鼎的Vector。 个人觉得,它是Vector公司最牛逼、最神秘、最高高在上的产品,犹如空谷回响、千里传音,但是很少看到它真正落地。 它最引以为傲的,或许是在给客户做介绍的时候,说“我们甚至能够精确到每一根线束的长度”,但是反观.

MaveDiao的博客 3484

java之面向对象:继承extends、super、覆盖override的用法

继承的好处: 1 )提高了代码的复用性。 2 )让类与类之间产生了关系,给第三个特征多态提供 了前提。 java支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良。 单继承:一个子类只能有一个直接父类。 class A { } class B { } class C extends A //单继承 { } 多继承:一个子类可以有多个直接各类(java中不允许

4718

JavaScript China城市联动

中国全城市的地址省,市,县 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <script src="jquery.js"></script> <script src="json.js"></...

唯唯同学 2241

重温java知识(十七、继承之三:属性覆盖)

子类可以依据自身需求对父类中的属性进行重名定义,该类操作称为属性覆盖。 package com.mydemo; public class ChannelDemo { public static void main(String args[]) { DatabaseChannel databaseChannel = new DatabaseChannel(); ...

yuzhiboyouzhu的博客 310

基于深度学习实现实时视频目标检测

实时视频目标检测是计算机视觉领域的研究热点之一,其应用场景包括智能监控、自动驾驶、机器人视觉等多个领域。深度学习技术的快速发展使得实时视频目标检测变得更加可行和准确。本文提出一种基于深度学习实现的实时视频目标检测系统,使用Python和OpenCV作为开发工具,具有高效、准确和实时的特点。 本系统的主要需求是实现实时视频目标检测功能,可以在不同的应用场景中使用。具体的需求如下:2.1 视频输入本系统需要从摄像头或视频文件中获取实时视频流,并对视频流中的目标进行检测和跟踪。2.2 目标检测本系统需要使用深度学

分享毕业设计的案例和论文 1940

3D高斯溅射融合Gabor滤波器:频率感知如何提升神经渲染效率与质量

在计算机视觉与图形学领域,3D场景重建旨在从多视角图像中恢复真实世界的三维结构与外观。其核心原理是通过优化场景表示,使渲染出的二维图像与输入照片尽可能一致。传统方法在效率与细节保真度间常面临权衡,高频细节(如精细纹理、锐利边缘)的重建尤为消耗算力。频率感知技术为此提供了突破方向,它借鉴信号处理思想,将场景分解为不同空间频率的成分进行针对性建模。Gabor滤波器作为经典的频率-方向分析工具,能有效刻画纹理的局部频域特征。将Gabor的频率选择性与3D高斯溅射(3DGS)这一高效显式表示结合,构成了神经Gabo

weixin_33087827的博客 272

python中的类class: 继承、覆盖、重写、重载、扩展、多态、封装

python中的类class: 继承、覆盖、重写、重载、扩展、多态、封装

Toby的博客 3万+

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 212

面向对象复习

面向对象 1.什么是面向对象 面向对象编程OOP 本质:以类的方式组织代码,以对象的组织(封装)数据 抽象 三大特征:封装、继承、多态 2. 类与对象关系 类是一种抽象的数据类型,它是对某一类事务整体的描述/定义,但是并不能代表一个具体的事务 比如Person类代表所有的人,Car类代表所有的车,这些都是用来描述或定义某一类具体的事务应该具备的特点和行为 对象是抽象概念的具体实例 比如张三是Person类的具体实例,他开的宝马就是Car类的具体事例 3.创建与初始化对象 3.1 使用ne

weixin_51421734的博客 182

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

SAP UI5 本地开发工具 fiori-tools-proxy 中间件详解及使用场景

该中间件基于 http-proxy-middleware 库实现,分为 ui5 资源代理和 backend 代理两大模式,并可与 fiori run 或 ui5 serve 命令无缝集成,通过配置 ui5.path、ui5.url 以及 backend.path、backend.url 等参数,实现与目标系统的灵活对接和安全配置 (就后端系统代理而言,fiori-tools-proxy 内置 @sap-ux/backend-proxy-middleware,可将以指定前缀(如。

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

【无标题】多态与继承

必要条件。

weixin_66672558的博客 144

扰动观察法MPPT控制器simulink仿真

最大功率点跟踪(MPPT)控制器对于光伏(PV)系统至关重要,因为它可以确保系统在所有操作条件下都能从光伏阵列中提取最大功率。扰动观察法(P&O)是一种广泛使用的MPPT算法,因为它简单且易于实现。本文介绍了P&O MPPT控制器的Simulink仿真,并分析了其性能。

qq_59747472的博客 318

JAVA面对对象三大特征之继承、多态

面对对象三大特征继承、多态继承1.继承的概念:2.继承的实现:3.继承的好处与弊端:4.super5.继承中的成员访问特点以及访问修饰符:JAVA中的访问修饰符6.方法重写以及继承的注意事项:多态1.多态的概念2.多态中成员访问特点3.多态的好处和弊端4.多态中的转型   关于JAVA面对对象的三大特征,在之前的博客, 我们已经介绍了封装, 在这里我们将接下来介绍继承和多态,欢迎大家一起探讨、学习。 继承 在之前我们也介绍了它的概念, 接下来我们复习一下。 1.继承的概念:   继承是指这样一种能力:它可以

S_yyuan的博客 2530

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

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

什么是继承,什么是多态,方法的重载和覆盖有何区别?

什么是继承,什么是多态,方法的重载和覆盖有何区别?   1、什么是继承?   继承是子类调用父类的属性和方法。在Java中通过extends关键字实现,格式为Class 子类 extends 父类{主体}。   子类不能继承父类private的特性和构造方法。Java中只能是单继承的**,一个类只可以有一个父类,一个父类可以有多个子类**,实例化子类默认优先调用父类。   2、什么是多态?   多...

qq_37020594的博客 4410

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

封装、继承和多态

这时我们就可以定义一个动物类,这个类包含了这些重复的成员变量和成员方法,这时狗这个类就可以继承动物这个类,那些重复的成员变量和成员方法在狗这个类中就不用再出现,但是狗这个类也是包含这些重复的成员变量和成员方法,因为狗继承了动物这个类。在上述的代码中,在Son类中并没有调用Dad类的方法,那为什么在调用子类的构造方法时会调用父类的构造方法?,这样产生新的类,称派生类。此时当在父类写一个和子类方法名一样的show()方法时,d对象调用的show()方法是父类的还是子类的?

Milliliter___的博客 4883

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java(extends - 继承、implements - 接口、多态、方法重写\覆盖)

extends - 继承 概念: 子类/衍生类/扩展类 父类/基类 子类继承父类, 就继承了父类所有的成员变量和方法,不能继承构造方法,只能调用 所有的类, 都有唯一的父类 如果没有写父类, 说明父类就是 Object 子类中还可以定义自己的独特的成员变量和方法 子类的功能一定比父类要强大 public static class A extends Object{} public static class B extends A {} public static class C extends A

DZiXin的博客 1174

[Java] 继承和多态

生活中有很多继承的例子,如儿子继承父亲的家产,学弟继承学长的宿舍等,而在Java中继承就是子类继承了父类里面的成员,也就相当于在父类的基础上进行拓展的内容放到子类里面,从简单到复杂的过程,而Java里面的继承是通过extends关键字实现的。

2402_83046353的博客 1327

Flutter学习之Dart 中的 extends 继承操作

我们在其他语言中都存在这继承的操作,在 dart 中同样存在,都是使用 extends 关键字来做为继承。下面就详细介绍下 dart 中的继承。 Dart 中的继承操作 使用关键字 extends 继承一个类 子类会继承父类可见的属性和方法,不会继承构造方法 子类能够复写父类的方法,getter 和 setter 单继承,多态性 实战 新建一个 Person.d...

Wayfreem的博客 1万+

java之继承与多态

带你轻松了解多态与继承

G13138200303的博客 1418

Java 基础入门(十):继承与多态详解——extends、super、方法重写与类型转换

本文是 Java 基础入门系列第十篇,主要讲解面向对象的继承与多态。内容涵盖 extends、super、final 关键字,父子类成员访问、方法重写、访问权限及继承关系下的初始化顺序,并深入分析多态的实现原理、向上转型、向下转型和 instanceof 的使用。通过代码示例理解动态绑定、成员变量隐藏与方法重写的区别,帮助读者掌握继承与多态的核心知识,为后续学习抽象类和接口打下基础。

深耕 Java 后端,沉淀技术知识,记录成长之路。 1496

java中extends用法_JAVA的extends用法

理解继承是理解面向对象程序设计的关键。在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中不允许多继承。(1)继承classAnimal{voideat(){System.out.println("Animaleat");}voidsleep(){System.out.println("Animalsleep")...

weixin_27180827的博客 8340

java继承和多态

是面向对象编程中的一个重要概念,是一种类与类之间的关系,子类可以获取父类的成员(包括属性和方法),并可以在此基础上添加自己的新成员属性和方法,还可以重写父类的方法。重写是指在子类中重新定义父类已存在的方法,子类可以根据自身的需求对父类的方法进行不同的实现,从而实现多态性。在构造方法中:this(···)用来调用本类的构造方法,super(···)用来调用父类的构造方法,不能同时出现。子类会继承父类的数据,可能还会使用父类的数据,所以子类在初始化之前会先完成父类的初始化。

huohaiyu的博客 930

简单的理解 类的继承 和 多态性

/* * Created on 2004-8-31 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates *//** * @author diyer6 * * TODO To change the temp

2539

《JAVA从入门到精通视频》笔记十一:继承(extends),方法覆盖(override)和多态

1.继承(extends) 1.1 什么是继承?有什么用?        基本作用:子类继承父类,代码可以得到复用。        主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。 1.2 继承的相关特性        - B类继承A类,则称A类为超类(superclass)、父类

weixin_44384631的博客 487

Java中的继承和多态

如图所示,Dog类和Cat类继承了Animal类,其中Dog类和Cat类被称为子类或派生类,Animal类被称为父类或基类或超类,它们的关系也如父子一样,Dog和Cat通过继承Animal来复用Animal中的成员,也就是说子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。b. 子类访问父类成员方法:与变量访问一致,也遵循就近原则,如果有子类和父类的方法发生重载的情况,选择参数合适的那个方法。,如果子类自己有则用自己的,没有则用父类的,都没有报错,当子类和父类的成员变量。

HackerMessi的博客 1252
上一篇: java学习(九)static和this使用
下一篇: java学习(十一)super
python_nice
博客等级 码龄8年 46粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值