【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

news2024/11/22 22:46:06

文章目录

  • 285. 为什么需要继承
  • 286. 继承原理图
  • 287. 继承快速入门
  • 288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5
    • 288.1 继承给编程带来的便利
    • 288.2 继承的深入讨论/细节问题
  • 293. 继承本质详解
  • 294. 继承课堂练习1
  • 295. 继承课堂练习2
  • 296. 继承课堂练习3

285. 为什么需要继承

286. 继承原理图

继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。画出继承的示意图。

  • 继承的基本语法

287. 继承快速入门

写一个Student基类,让小学生类Pupil类和大学生类Graduate类继承Student基类。
Student.java

package com.Marisa.extend_;

public class Student {
    //共有属性
    public String name;
    public int age;
    private double score;//成绩
    //共有的方法
    public void setScore(double score) {
        this.score = score;
    }
    public void showInfo() {
        System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);
    }
}

Pubil.java

package com.Marisa.extend_;

public class Pupil extends Student{
    public void testing() {
        System.out.println("小学生 " + name + " 正在考小学数学..");
    }
}

Graduate.java

package com.Marisa.extend_;

public class Graduate extends Student{
    public void testing() {//和 Pupil 不一样
        System.out.println("大学生 " + name + " 正在考大学数学..");
    }
}

Extends01.java

package com.Marisa.extend_;

public class Extends01 {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.name = "田所浩二";
        pupil.age = 24;
        pupil.testing();
        pupil.setScore(50);
        pupil.showInfo();
        System.out.println("=======");
        Graduate graduate = new Graduate();
        graduate.name = "德川";
        graduate.age = 23;
        graduate.testing();
        graduate.setScore(80);
        graduate.showInfo();

    }
}

运行结果:
小学生 田所浩二 正在考小学数学…
学生名 田所浩二 年龄 24 成绩 50.0
=======
大学生 德川 正在考大学数学…
学生名 德川 年龄 23 成绩 80.0

288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5

288.1 继承给编程带来的便利

  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了

288.2 继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

  2. 子类必须调用父类的构造器, 完成父类的初始化




    在子类无参构造器中隐藏了一句话super();

  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过(怎么理解。) [举例说明]


在父类里写一个有参构造器,并注释无参构造器:

因为没用super去指定父类构造器,子类的构造器报错:

用super方法指定了父类构造器:

  1. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
    在父类中有三个参数不同的构造器:

    在子类的构造器中指定父类的构造器:

    【注】调用父类的无参构造器(如果有),可以不写super()

  2. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
    如果不放在第一行,报错:

  3. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
    本意是先执行父类构造器,再执行子类的构造器,但是这是不允许的。(this()也只能放在构造器里,且为第一句)

  4. java 所有类都是 Object 类的子类, Object 是所有类的基类.

  5. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)

  6. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制

思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】
10) 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系

293. 继承本质详解



JVM将类信息加载到方法区

294. 继承课堂练习1


输出
a
b name
b
原因:创建B类对象,先执行的是B类的无参构造器,在B类的无参构造器中用this调用了有参构造器,然后B类继承于A类,A类是基类,而且有参构造器没用super()且A类有默认无参构造器,所以调用B类的有参构造器的时候,会先调用A类的无参构造器,输出a,然后再输出b name,这时候B类的有参构造器this执行后,继续执行B类无参构造器的剩下的语句b

295. 继承课堂练习2


和上一个题目类似,答案是
我是A类
hahah 我是B类的有参构造器
我是C类的有参构造器
我是C类的无参构造器

296. 继承课堂练习3

编写 Computer 类,包含 CPU、内存、硬盘等属性,getDetails 方法用于返回 Computer 的详细信息
编写 PC 子类,继承 Computer 类,添加特有属性【品牌 brand】
编写 NotePad 子类,继承 Computer 类,添加特有属性【color】
编写 Test 类,在 main 方法中创建 PC 和 NotePad 对象,分别给对象中特有的属性赋值,以及从 Computer 类继承的属性赋值,并使用方法并打印输出信息
Computer.java

package com.Marisa.exercise;

public class Computer {
    private String cpu;// CPU
    private int memory;//内存容量
    private int disk;//硬盘容量

    public Computer(String cpu, int memory, int disk) {
        this.cpu = cpu;
        this.memory = memory;
        this.disk = disk;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public int getMemory() {
        return memory;
    }

    public void setMemory(int memory) {
        this.memory = memory;
    }

    public int getDisk() {
        return disk;
    }

    public void setDisk(int disk) {
        this.disk = disk;
    }

    //返回Computer信息
    public String getDetails(){
        return "CPU=" + cpu + "\nmemory=" + memory + "\ndisk=" + disk;
    }
}

PC.java

package com.Marisa.exercise;

public class PC extends Computer{
    private String brand;

    public PC(String cpu, int memory, int disk, String brand) {
        super(cpu, memory, disk);
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void printInfo(){
        //调用父类getDetails方法
        System.out.println("PC信息如下:");
        System.out.println(getDetails());
        System.out.println("Brand=" + brand);
        System.out.println();
    }
}

NotePad.java

package com.Marisa.exercise;

public class NotePad extends Computer{
    String color;

    public NotePad(String cpu, int memory, int disk, String color) {
        super(cpu, memory, disk);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void printInfo(){
        System.out.println("NotePad信息如下:");
        //调用父类getDetails方法
        System.out.println(getDetails());
        System.out.println("Color=" + color);
        System.out.println();
    }
}

Test.java

package com.Marisa.exercise;

public class Test {
    public static void main(String[] args) {
        PC pc = new PC("Intel Core i9 12900KF", 64, 1024, "ROG");
        pc.printInfo();
        NotePad notePad = new NotePad("高通8Gen2", 12, 512, "黑色");
        notePad.printInfo();
    }
}

运行结果:
PC信息如下:
CPU=Intel Core i9 12900KF
memory=64
disk=1024
Brand=ROG

NotePad信息如下:
CPU=高通8Gen2
memory=12
disk=512
Color=黑色

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现,linux默认不带中文字体,因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径: C:\Windows\Fonts 的中文字体,如扩展名为 TTC 与TT…

App模拟心跳长连接的实现方法demo

摘要 背景:心跳通常是指客户端或服务器定期发送一个小型的、空的消息以保持连接的活动状态。它用于检测连接是否仍然有效,并防止连接由于长时间没有活动而被关闭。 技术原理:App定时发消息给服务器,服务器回消息表示连接依旧有效…

手机竖屏 Premiere Pro 电影转场特效视频模板Pr工程文件

10个不同的类别和115个过渡。过渡很容易使用。随附视频教程。 下载地址:Pr模板网 下载链接:https://prmuban.com/40597.html

动态规划算法专题(五):子序列问题

目录 1、最长递增子序列 1.1 算法原理 1.2 算法代码 2、摆动序列 2.1 算法原理 2.2 算法代码 3、最长递增子序列的个数 3.1 算法原理 3.2 算法代码 4、最长数对链 4.1 算法原理 4.2 算法代码 5、最长定差子序列 5.1 算法原理 5.2 算法代码 6、最长的斐波那契子序…

NASA:气象追踪分子光谱(ATMOS)二级产品,包含在垂直高度(公里)网格上的微量气体

目录 简介 摘要 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Tab Delimited Format V3 (ATMOSL2AT) at GES DISC 简介 这是版本3的气象追踪分子光谱(ATMOS)二级产品,包含在垂直高度&#…

多线程股吧(东方财富)用户信息爬取

多线程东方财富(股吧)用户信息爬取 在上一篇博客股吧信息爬取的基础上加入了多线程,使得速度提升了十几倍,爬取内容如下: 最终爬取结果如下: 完整代码如下(准备好环境,比如pytho…

安宝特案例 | Fundació Puigvert 医院应用AR技术开创尿石症治疗新纪元

案例介绍 在医疗科技不断进步的今天,Fundaci Puigvert 医院迈出了重要一步,成功应用AR技术进行了全球首例同时使用两台内窥镜的ECIRS手术(内镜肾内联合手术),由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。这标志着…

yub‘s Algorithmic Adventures_Day7

环形链表 link:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 思路分析 我只能说双指针yyds【刻板hh】 我们分两种情况来分析 起码在第二圈才会相遇 fast比slow多走环的整数倍 fast 走的步数是 slow 步数的 2 倍,即 f2s&#xff…

5.资源《Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件(含驱动代码)》说明。

资源链接: Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件(含驱动代码) 1.文件明细: 2.文件内容说明 包含:proteus工程,内含设计图和工程代码。 3.内容展示 4.简述 工程功能可以看这个视频 数码…

微信小程序流量主

开发小程序也已经有一段时间了,也是为了添加流量主来开发小程序,根据小程序的定位,来获取用户想要的资源,通过广告的形式来增加用户的点击量进行收益,收益虽然微不足道,但是也是很有成就感的

活动邀请 | SonarQube×创实信息即将亮相2024 GOPS全球运维大会-上海站,分享代码质量与安全提升策略

2024年10月18日-19日(周五-周六),第二十四届 GOPS 全球运维大会上海站将在上海中庚聚龙酒店举办。 大会为期2天,侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/…

宠物咖啡馆服务平台:SpringBoot技术深度解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

2024_10_8 系统进展

改进位置 发现是label_api里藏了我需要改进的东西 settings.py 数据库 我这边电脑上使用的是windows 192 vue.config.js 陈家强是这样设置的 module.exports {publicPath: process.env.NODE_ENV production? /: /,assetsDir: static,// css: {// extract: false// },…

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下: 对应的实体类为:UserInfoMapper 所有的准备工作都在如下文章。 MyBati…

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标:了解大模型理论体系 第二轮学习目标:进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。 预训练(Pretraining&…

[paddle]paddleseg快速开始

快速开始 为了让大家快速了解PaddleSeg,本文档使用一个简单示例进行演示。在实际业务中,建议大家根据实际情况进行调整适配。 在开始下面示例之前,请大家确保已经安装好PaddleSeg开发环境(安装说明)。 1 准备数据 …

被AI坑的一天—CentOS7导入阿里云YUM源报错的 GPG密钥提示404

过于相信人工智能 配置YUM源根据AI的说法换阿里云的YUM源验证AI配置结果解决问题 配置YUM源 由于电脑受限制 , 不能访问境外网站,所以用不了centos自带的源 ,是报404的 根据AI的说法换阿里云的YUM源 编辑 /etc/yum.repos.d/CentOS-Base.repo ,更换为 配置完成后sudo yum …

nacos多数据源插件介绍以及使用

概述 在微服务架构中,服务配置的集中管理和动态调整是至关重要的。Nacos 提供了配置管理和服务发现的功能,其中配置管理支持动态数据源的切换,增强了其在复杂环境中的适用性。默认情况下,Nacos 支持 MySQL 和Derby,但…

C++——AVL树的模拟实现

目录 一、AVL树结点 二、AVL树结构 三、插入数据(重点) 1、右单旋 2、左单旋 3、左右双旋 4、右左双旋 AVL树是一颗平衡二叉搜索树,它的本质就是一颗之前说过的二叉搜索树。但是二叉搜索树可能会出现极端情况,导致二叉搜索树变…

不同时期的USB接口

Type-A Type-A接口最早于USB1.0标准(1996)推出,拥有四个引脚:VBUS提供5V电源,D-和D用于数据传输,GND接地。 Type-B Type-B接口最早于USB1.0标准(1996)推出,拥有四个引脚:VBUS提供5V电源,D-和D用…