【韩顺平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函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实际的参数类型产生函数特定版本。…

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

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

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 …

CSS3--美若天仙!?

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

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

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

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

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

扩展、包含、泛化-系统架构师(七十七)

1()是系统分析阶段结束后得到的工作产品,()是系统测试阶段完成后的工作产品。 问题1 A系统设计规格说明 B系统方案建议书 C系统规格说明 D单元测试数据 问题2 A验收测试计划 B测试标准 C系统测试计划 D操作手…

社团活动助手系统小程序的设计

管理员账户功能包括:系统首页,个人中心,活动分类管理,用户管理,社团活动管理,报名信息管理,签到登记管理,投票项目管理,系统管理 微信端账号功能包括:系统首…

四款语音转文字神器,一键搞定会议记录!

嘿,朋友们,今天咱们来聊聊那些语音转文字的免费软件吧!在这个快节奏的时代,谁不想省点时间,少敲几下键盘呢?尤其是那些开会、采访或者闲聊时,语音消息满天飞的日子,一个好用的语音转…

【业务场景】最全的购物车设计与实现

前言 博主最近在做一个购物商城,正好设计到购物车模块,于是乎全面的来聊一聊购物车模块实现的一些核心要点吧,很值得反复品味的设计,当需要实现购物车的时候,本文应该拿来就能用。 目录 1.需要解决的核心问题清单 2…

Mybatis-plus做了什么

Mybatis-plus做了什么 Mybatis回顾以前的方案Mybatis-plus 合集总览:Mybatis框架梳理 聊一下mybatis-plus。你是否有过疑问,Mybatis-plus中BaseMapper方法对应的SQL在哪里?它为啥会被越来越多人接受。在Mybatis已经足够灵活的情况下&…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

【Java 并发编程】多线程安全问题(上)

前言 虽然并发编程让我们的 CPU 核心能够得到充分的使用,程序运行效率更高效。但是也会引发一些问题。比如当进程中有多个并发线程进入一个重要数据的代码块时,在修改数据的过程中,很有可能引发线程安全问题,从而造成数据异常。 p…