4.1 继承

思维导图:

 

第4章 面向对象(下)


学习目标:

  • 了解面向对象中的继承特性,掌握继承的概念与特点。
  • 掌握方法的重写,能够在子类中重写父类方法。
  • 掌握super关键字,明白如何在类中使用super访问父类成员。
  • 理解final关键字的作用,知道如何使用final修饰类、方法和变量。
  • 熟悉抽象类的定义与使用。
  • 理解接口的定义,能独立编写接口。
  • 掌握多态性,知道如何利用对象类型转换解决继承中的多态问题。
  • 了解Object类及其常用方法。
  • 熟悉内部类及其四种形式的特点。

继续学习: 第3章已经介绍了面向对象的基础用法以及封装性。本章将进一步深入探讨继承和多态。

4.1 继承

4.1.1 继承的概念
  • 现实与编程的对应:

    • 现实中的继承:子女继承父辈的财产、事业等。
    • 编程中的继承:描述事物间的从属关系。例如,猫和狗都是动物,可以说猫和狗继承自动物类。
  • 示例:

    • 动物(Animal)
      • 猫(Cat)
        • 波斯猫(PersianCat)
        • 巴厘猫(BalineseCat)
      • 狗(Dog)
        • 沙皮狗(SharPeiDog)
        • 斑点狗(DalmatianDog)
  • Java中的继承:

    • 子类自动继承父类的属性和方法。
    • 使用extends关键字表示继承。
class 父类 {
  // ...
}

class 子类 extends 父类 {
  // ...
}
4.1.2 示例解析

Example01.java文件中:

  • Animal类定义了name, age, 和COLOR属性,以及相应的gettersetter方法。
  • Dog类继承自Animal类,因此可以访问Animal类的属性和方法。
  • main方法中,我们创建了Dog类的对象并设置了其nameage属性的值,然后输出了这些值。

结果表明,尽管子类Dog没有明确定义任何属性和方法,但它能够继承并使用来自父类Animal的属性和方法。


4.1.3 继承的扩展

子类不仅可以继承父类的特性,还可以添加自己的特性。

Example02.java中:

  • 我们对Dog类进行了扩展,添加了一个新的color属性以及相应的gettersetter方法。

这说明,在子类中,我们可以保留父类的特性的同时添加新的特性。


  • 文件4-2的内容

    • Dog类继承:在文件4-2中,Dog类继承了Animal类的属性和方法。
    • 新增属性:Dog类增加了颜色(color)的getter和setter方法。
    • 示例代码:在main()方法中,通过dog对象分别调用Animal和Dog类的setter方法来设置名称、年龄和颜色。接着,调用getter方法来获取这些属性值。
    • 运行结果:输出“名称:牧羊犬,年龄:3,颜色:黑色”。
  • 继承中的权限注意事项

    • 子类可以继承父类的成员和方法。
    • 但子类只能访问使用publicprotected修饰的属性和方法。
    • 使用defaultprivate修饰的属性和方法不能被子类访问。
  • 类继承中的几个关键点

    1. 单继承原则:在Java中,每个类只能直接继承一个父类。例如,一个类不能同时继承A类和B类。
    2. 多类继承同一父类:多个子类可以共同继承同一个父类。例如,B类和C类都可以继承A类。
    3. 多层继承:Java支持多层继承。例如,C类可以继承B类,而B类又继承A类。在这种情况下,C类即是B类的子类,也是A类的子类。
    4. 父类和子类的相对性:在Java中,父类和子类的概念是相对的。一个类可能是另一个类的父类,同时也可能是其他类的子类。

4.1.2 方法的重写

重写的概念

在面向对象的编程中,当子类继承父类后,会自动继承父类的所有方法。但在某些情境下,子类可能需要对其继承的方法进行修改或调整。这个过程被称为“方法的重写”。

要点:

  • 方法重写也被称为覆盖。
  • 重写的方法和被重写的方法必须有相同的方法名、参数列表和返回值类型。
方法的重写实例

考虑以下代码示例:

// 定义Animal类
class Animal {
    // 定义动物叫的方法
    void shout() {
        System.out.println("动物发出叫声");
    }
}

// 定义Dog类,继承Animal类
class Dog extends Animal {
    // 重写父类Animal的shout()方法
    void shout() {
        System.out.println("汪汪汪……");
    }
}

// 定义测试类
public class Example03 {
    public static void main(String[] args) {
        Dog dog = new Dog();  // 创建Dog类的实例对象
        dog.shout();          // 调用Dog类重写的shout()方法
    }
}

此代码的运行结果为“汪汪汪……”。

注意点
  1. 方法重写的目的是为了让子类具有更具体或与父类不同的行为。
  2. 子类重写父类方法时,不能使用比父类方法更严格的访问权限。例如,如果父类的方法是public,那么子类重写的方法不能是private。

思考与总结

  • 通过方法重写,子类可以继承父类的功能,同时还可以根据自己的需要对这些功能进行改进或扩展。
  • 在Java中,方法的重写是多态的一个关键组成部分,允许程序在运行时动态地选择应该调用哪个方法。
  • 当子类的对象调用一个被重写的方法时,它总是调用子类中的版本,而不是父类中的版本。
提示

当重写一个方法时:

  • 保持方法签名的一致性(即相同的方法名、参数列表和返回类型)。
  • 不要在子类中使用比父类中被重写的方法更严格的访问权限。

4.1.3 super关键字

介绍

当子类重写父类的方法后,子类对象将无法访问父类中被子类重写过的方法。为了解决这个问题,Java提供了super关键字,使用super关键字可以在子类中访问父类的非私有方法、非私有属性以及构造方法。

使用super关键字访问父类的属性和方法

  1. 格式

    super.属性
    super.方法(参数1, 参数2, ...)
    

  2. 案例:如文件4-5所示,Dog类通过super关键字访问父类Animalshout()方法和name属性。

    // 定义Animal类
    class Animal {
        String name = "牧羊犬";
        
        void shout() {
            System.out.println("动物发出叫声");
        }
    }
    
    // 定义Dog类,继承Animal类
    class Dog extends Animal {
        public void shout() {
            super.shout();
            System.out.println("汪汪汪……");
        }
    
        public void printName() {
            System.out.println("名字:" + super.name);
        }
    }
    
    // 测试类
    public class Example05 {
        public static void main(String[] args) {
            Dog dog = new Dog();
            dog.shout();
            dog.printName();
        }
    }
    

    运行结果:动物发出叫声,汪汪汪……,名字:牧羊犬

使用super关键字调用父类的构造方法

  1. 格式

    super(参数1, 参数2, ...)
    
  2. 案例:如文件4-6所示,Dog类通过super关键字调用父类Animal的有参构造方法。

    // 定义Animal类
    class Animal {
        private String name;
        private int age;
        
        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String info() {
            return "名称:" + this.name + ", 年龄:" + this.age;
        }
    }
    
    // 定义Dog类,继承Animal类
    class Dog extends Animal {
        private String color;
    
        public Dog(String name, int age, String color) {
            super(name, age);
            this.color = color;
        }
    
        @Override
        public String info() {
            return super.info() + ", 颜色:" + this.color;
        }
    }
    
    // 测试类
    public class Example06 {
        public static void main(String[] args) {
            Dog dog = new Dog("牧羊犬", 3, "黑色");
            System.out.println(dog.info());
        }
    }
    

    运行结果:名称:牧羊犬,年龄:3, 颜色:黑色

注意事项

  • 使用super调用父类构造方法的代码必须位于子类构造方法的第一行。
  • 使用thissuper调用构造方法代码都要求必须放在构造方法的首行,所以不能同时出现。

superthis关键字的对比

区别点superthis
访问属性直接访问父类中的非私有属性访问本类中的属性,如果本类中没有该属性,则从父类中继续查找
调用方法直接调用父类中的非私有方法调用本类中的方法,如果本类中没有该方法,则从父类中继续查找
调用构造方法调用父类构造方法,必须放在子类构造方法的首行调用本类构造方法,必须放在构造方法的首行

 

 

 

 总结:

4.1 继承的重点:

  1. 继承的定义:继承是 Java 面向对象的一个核心机制,它允许一个类继承另一个类的属性和方法。
  2. 关键字 extends:在 Java 中,使用 extends 关键字来表示一个类继承另一个类。
  3. 父类和子类:在继承中,被继承的类称为父类或超类,继承父类的类称为子类。
  4. 方法的重写:子类可以重写父类的方法,以提供特定于其自身的实现。
  5. super 关键字:在子类中,super 关键字被用来引用父类的成员(方法、属性)和构造器。

难点:

  1. 方法重写的规则:在重写方法时,必须保持方法签名(方法名称和参数列表)相同,并且子类的方法不能降低父类方法的访问权限。
  2. 使用 super 关键字:理解何时以及如何正确使用 super 关键字来调用父类的构造器或方法可能需要实践。
  3. 构造器和继承:父类的构造器不被子类继承,但子类的构造器必须(显式或隐式)调用父类的构造器。

易错点:

  1. 访问修饰符的误用:尝试访问父类的 private 成员或降低重写方法的访问权限时会导致错误。
  2. 忘记调用父类的构造器:如果父类没有默认的无参数构造器,并且在子类的构造器中没有显式调用父类的构造器,这会导致编译错误。
  3. superthis 的混淆:混淆它们的用途或在同一构造器中同时使用它们(因为它们都需要在构造器的首行)可能导致错误。
  4. 方法隐藏:如果子类中定义了一个与父类中同名但参数不同的方法,这不是重写,而是方法的隐藏,有时可能会导致预期之外的行为。

综上,理解和应用 Java 的继承机制需要时间和实践,但它为创建模块化和可重用的代码提供了强大的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/111724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序如何使用地球半径计算两组经纬度点之间的距离(自身位置与接口返回位置)【上】

目录 1.配置位置权限 2.获取当前自身经纬度 3. 请求接口拿到返回经纬 4. 循环取每一项的经纬 5.如何判断是否打开了定位权限 6.进行距离计算操作 7.运行效果 8.完整代码 首先在使用小程序时,请求的接口一定要去配置合法域名,才能够进行接下来…

缓存击穿只会逻辑过期 OR 互斥锁?深入思考 == 鹤立鸡群

网上但凡看得见的文章,大部分在说缓存穿透时都是无脑分布式锁 / 逻辑过期,分布式锁一点问题都没有么?逻辑过期一点问题都没有么?还能不能再进一步优化? 在聊聊缓存击穿的双重判定锁之前,我们将按照循循渐进…

双十一首日捷报 | 德施曼率先破亿,再度蝉联智能锁品类第一

10月31日晚8:00,各大平台迎来了双十一第一波现货开售。其中,在智能锁类目中德施曼势头最为迅猛,此前,德施曼凭借“全民换锁季”主题活动,在预售期间就已经全面引爆消费者换锁热潮,随着此次现货开售&#xf…

cut 命令

cut [选项参数] filename #默认分隔符是制表符 选项参数: -d delimiter 分隔符 -f field 场地、领域(第几列) 命令使用: cut -d " " -f 1 cut.txt #空格为分隔符截取第1列cut -d " " -f 2,3 cut.txt #截…

百度上传自己个人简介攻略,个人介绍百度百科怎么做?

个人介绍要展示在百度百科上该怎么操作,我们都清楚百度百科词条是需要申请才能拥有的,但是没有百度上传自己个人简介的攻略,很多人是不知从何下手的。下面洛希爱做百科网带着大家一起来了解。 一、了解百度百科词条的创建规则 1. 词条名称规…

jdk官网下载(详细步骤)

jdk全部版本下载网址 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/ 下载之前先建立oracle账号(免费创建),不用特意去搜,你点击下载jdk的时候会自动弹出来,自己建立一个账号就能下载了 找到自己要下载…

【产品体验】OA办公系统

一、演示地址 http://admin.dianshixinxi.com:90/index 二、办公管理功能 1.我的待办:当前登录用户,办理任务 2.通知公告:通知与公告,已发布通知公告会显示在首页 3.自定义表单:自定义表单,托拉拽的形式…

iZotope RX 10(音频修复和增强工具)

iZotope RX 10是一款音频修复和增强软件,主要特点包括: 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…

IDEA 使用技巧

文章目录 语言支持简化编写 有问题,可暂时跳过 个人常用快捷键插件主题插件功能插件 碰到过的问题 除了一些在Linux上用vim开发的大佬,idea算是很友好的集成开发工具了,功能全面,使用也很广泛。 记录一下我的 IDEA 使用技巧&#…

解密人工智能:KNN | K-均值 | 降维算法 | 梯度Boosting算法 | AdaBoosting算法

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、KNN三、K-均值四、降维算法五、梯度Boosting算法和AdaBoosting算法六、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法,通过对大量数据的学习和分析&…

虹科示波器 | 汽车免拆检修 | 2013款大众途观车发动机加速无力

一、故障现象 一辆2013款大众途观车,搭载CGM发动机,累计行驶里程约为12.6万km。车主进厂反映,发动机加速无力。 二、故障诊断 接车后试车,发动机怠速运转正常;原地将加速踏板踩到底,发动机转速最高只能达到…

AQS面试题总结

一:线程等待唤醒的实现方法 二: 介绍一下LockSupport 三:AQS是什么 AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的FIFO队列完成资源获取排队工作,将每条要去抢占资源的线程封装成一个NODE节点来…

抛开八股——实际业务下如何设计缓存与数据库一致性解决方案

前言 对于缓存与数据库一致性的八股文也是老生常谈了,但是所谓没有最好的方案,只有最合适的方案,如果我们一味的去硬啃八股文,很容易就丧失了对于业务的基本分析能力,更别说针对业务来设计出合理合适的解决方案&#x…

Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(下)

Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart吉祥物Dash 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/arti…

2015年亚太杯APMCM数学建模大赛A题海上丝绸之路发展战略的影响求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 A题 海上丝绸之路发展战略的影响 原题再现 一带一路不是实体或机制,而是合作与发展的理念和主张。凭借现有有效的区域合作平台,依托中国与有关国家现有的双边和多边机制,利用古丝绸之路的历史象征&#xff0…

如何看待将本增效?

如何看待将本增效? 么是降本增效?就是公司里,增进收益的动作要多做,无效的动作要少做,甚至不做。什么叫有效?回到公司的经营目标上去,企业的管理就是目标管理。降本,需要卓越运营&a…

reese84

网址:https://beta.makeabooking.flyscoot.com/ 这个基本上会在航空网站上出现,国内的我也没见过,然后这个是我很早很早之前的老友分享的,然后昨天花时间去看了一下,之前经常听其他大佬说,但是我也出来没遇见过。 感觉…

损坏的视频不能观看,还能修复吗?

3-1 在日常的生活或者工作中,特别是做摄像工作的人,有一定的概率会遇到损坏的视频文件,比如相机突然断电、无人机炸机等,都有可能导致保存的视频文件损坏。 如果遇到这种情况,该如何修复这种损坏的视频文件&#xff…

Java入门必刷的基础题1(八道)

目录 1. 第一题 2. 判定一个数字是否是素数 3. 打印 1 - 100 之间所有的素数 4. 输出 1000 - 2000 之间所有的闰年 5. 输出乘法口诀表 6. 求两个正整数的最大公约数 7. 求二进制中 1 的个数 8.分别输出二进制中的奇数位和偶数位 下面的源码大多只有方法体,需…

k8s资源对象--pod

创建pod: kubectl get pod cp test_pod_1.yaml nginx_pod.yaml cah 查看详细信息: pod的状态处于pending可能的原因:一个或多个没有运行 由于当前所有节点没有可用节点(所有节点资源不足,所有节点) 查看所有&…