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

文章目录

  • 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;// CPUprivate 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.mzph.cn/diannao/55741.shtml

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

相关文章

同城O2O系统源码与跑腿配送平台的架构设计与开发方案详解

今天,笔者将与您一同深入探讨同城O2O系统的源码及跑腿配送平台的架构设计与开发方案,助力开发者和企业在这一领域的实践与探索。 一、O2O系统概述 在同城O2O模式中,用户可以通过手机应用或网页平台下单,而配送员则根据订单信息迅…

[图形学]smallpt代码详解(1)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍,和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

鸿蒙NEXT开始公测,哪些机型可以升级?鸿蒙版微信界面简洁

华为 Harmony OS NEXT 于10月8日正式开启公测,对鸿蒙 NEXT 系统感兴趣,想要第一时间尝鲜鸿蒙系统的话,千万不要错过本篇文章! 哪些手机可以参与鸿蒙 NEXT 公测? 首批参与鸿蒙 NEXT 公测的机型有华为 Mate 60 系列、华…

Electron构建桌面应用程序,服务于项目的自主学习记录(持续更新...

无所畏惧地面对未知,并将其视为成长的机会 大纲官网快速入门1.安装node.js -- 这里推荐用nvm管理2.脚手架创建3.electron 包安装到应用的开发依赖4.创建主进程(main.js)并启动项目1.创建页面2.配置main.js3.启动项目 -- 效果 进阶 -- 基于项目场景功能使用场景一&am…

Java8新特性, 函数式编程及Stream流用法大全

用了多少年的java8了,Lambda表达式和stream流也经常用,但是也仅限于某些用法比较熟练,看见了 Function、Consumer 等函数式接口还是一脸懵逼,现在来全面总结一下java8这些新特性,也为自己后续查找做个备忘。如果你只是…

【C++】模板(初识):函数模板、类模板

本篇主要介绍C中的模板初阶的一些知识。模板分为函数模板和类模板,我们一个一个来看。 1.函数模板 1.1函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实际的参数类型产生函数特定版本。…

Golang

Golang,通常被称为Go,是由Google开发的一种开源编程语言。它最早由Robert Griesemer、Rob Pike和Ken Thompson在2007年设计并于2009年发布。Golang的设计目标是提高编写简单、高效和并发程序的能力,因此非常适合用于构建高并发的网络服务、分…

滚雪球学MySQL[4.4讲]:数据库的性能调优详解

全文目录: 前言1. 数据库性能调优的重要性2. 数据库性能调优策略2.1 索引优化2.1.1 创建合适的索引示例:创建单列索引和联合索引 2.1.2 避免过度索引2.1.3 使用覆盖索引示例:覆盖索引 2.2 查询优化2.2.1 使用EXPLAIN分析查询示例:…

C++:图的最短路径问题

一、简介 在非网图中,最短路径是指两顶点之间经历的边数最少的路径。在网图中,最短路径是指两顶点之间经历的边上权值之和最少的路径。 路径上的第一个顶点称为源点,最后一个顶点称为终点。 最短路径问题是图的一个比较典型的应用问题。例如&…

QT 通过鼠标事件实现图片的拖动和缩放

通过鼠标拖动来移动图片,并使用鼠标滚轮来缩放图片。 1、实现步骤: 1、移动图片: 使用QPoint记录图片的偏移量,当鼠标拖动时更新这个偏移量,在paintEvent()中根据偏移量绘制图片。2、缩放图片: 使用滚轮…

人工智能平台 PAI-DSW内置通义灵码实操

人工智能平台 PAI(Platform for AI,原机器学习平台PAI)是 AI Native 的大模型与 AIGC 工程平台,提供包含数据集管理、算力管理、模型工具链、模型开发、模型训练、模型部署、AI资产管理在内的功能模块,内置100种大模型…

02_23 种设计模式之《抽象工厂模式》

文章目录 一、抽象工厂模式抽象工厂模式的结构应用场景 示例代码(C)注意事项 一、抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是指当有多个抽象角…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中,很多场景中需要图形和详细信息的融合展示,那么在图表中可以新增普通列表与分组列表的配置。如下图所示: 配置说明 1、新增组件:配置入口如下图所示,新增组件时,选择普通列表与分…

前端vue-配置请求拦截器

1.配置拦截器,记得20行的导出 2.响应拦截器,记得28行的导出 3.拦截器不止可以拦截,还可以添加内容

Custom C++ and CUDA Extensions - PyTorch

0. Abstract 经历了一波 pybind11 和 CUDA 编程 的学习, 接下来看一看 PyTorch 官方给的 C/CUDA 扩展的教程. 发现极其简单, 就是直接用 setuptools 导出 PyTorch C 版代码的 Python 接口就可以了. 所以, 本博客包含以下内容: LibTorch 初步;C Extension 例子; 1. LibTorch …

【分布式微服务云原生】探索Dubbo:接口定义语言的多样性与选择

目录 探索Dubbo:接口定义语言的多样性与选择引言Dubbo的接口定义语言(IDL)1. Java接口2. XML配置3. 注解4. Protobuf IDL 流程图:Dubbo服务定义流程表格:Dubbo IDL方式比较结论呼吁行动Excel表格:Dubbo IDL…

合并村庄生活废水处理设备工艺流程

诸城市鑫淼环保小编带大家了解一下合并村庄生活废水处理设备工艺流程 设备的构造 该填料采用优质PVC材料制成,是一种新型的折波填料,间距为30mm,比表面积超过400m/m,具有不易堵塞的特点,表面波纹设计便于膜的附着。 该…

CSS3--美若天仙!?

免责声明:本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

H、Happy Number(2024牛客国庆集训派对day7)

题目链接: H-Happy Number_2024牛客国庆集训派对day7 (nowcoder.com) 题目描述: 翻译为中文: 数据范围: 输入样例: 680 输出样例: 326623 分析: 本来以为是dfs,但是看到数据范围1e9, 联想到是…

通信工程学习:什么是三网融合

三网融合 三网融合,又称“三网合一”,是指电信网、广播电视网、互联网在高层业务应用上的深度融合。这一概念在近年来随着信息技术的快速发展而逐渐受到重视,并成为推动信息化社会建设的重要力量。以下是对三网融合的详细解释: 一…