当前位置: 首页 > news >正文

java第二十三课 —— 继承

面向对象的三大特征

继承

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

继承的示意图

在这里插入图片描述

继承的基本语法

class 子类 extends 父类{}
  1. 子类就会自动拥有父类定义的属性和方法
  2. 父类又叫超类,基类。
  3. 子类又叫派生类。

以 Extends01.java 为例,我们编写了两个类,一个是Pupil 类(小学生),一个是Graduate(研究生)。体会使用继承的好处。

使用继承前:

Extends01.java

package com.hspedu.extend_;public class Extends01 {public static void main(String[] args) {Pupil pupil = new Pupil();pupil.name = "小明";pupil.age = 10;pupil.setScore(95);pupil.testing();pupil.show();Graduate graduate = new Graduate();graduate.name = "李明";graduate.age = 18;graduate.setScore(135);graduate.testing();graduate.show();}
}

Graduate.java:

package com.hspedu.extend_;public class Graduate {public String name;public int age;private double score;public void setScore(double score) {this.score = score;}public void testing(){System.out.println("大学生 " + name + " 正在考大学数学...");}public void show(){System.out.println("姓名:" + name + " 年龄:" + age + " 分数:" + score );}
}

Pupil.java:

package com.hspedu.extend_;public class Pupil {public String name;public int age;private double score;public void setScore(double score) {this.score = score;}public void testing(){System.out.println("小学生 " + name + " 正在考小学数学...");}public void show(){System.out.println("姓名:" + name + " 年龄:" + age + " 分数:" + score );}
}

使用继承后:

TestExtends.java

package com.hspedu.extend_.improve_;import com.hspedu.extend_.Graduate;
import com.hspedu.extend_.Pupil;public class TestExtends {public static void main(String[] args) {com.hspedu.extend_.Pupil pupil = new Pupil();pupil.name = "小明";pupil.age = 10;pupil.setScore(95);pupil.testing();pupil.show();com.hspedu.extend_.Graduate graduate = new Graduate();graduate.name = "李明";graduate.age = 18;graduate.setScore(135);graduate.testing();graduate.show();}
}

Student.java:

package com.hspedu.extend_.improve_;public class Student {public String name;public int age;private double score;public void setScore(double score) {this.score = score;}public void show(){System.out.println("姓名:" + name + " 年龄:" + age + " 分数:" + score );}
}

Graduate.java:

package com.hspedu.extend_.improve_;public class Graduate extends Student{public void testing(){System.out.println("大学生 " + name + " 正在考大学数学...");}
}

Pupil.java:

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

继承给编程带来的便利

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

继承的细节问题

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

    例子:

    ExtendsDetail.java:

    package com.hspedu.extend_;public class ExtendsDetail {public static void main(String[] args) {Sub sub = new Sub();sub.sayOk();}
    }
    

    Base.java:

    package com.hspedu.extend_;public class Base {//父类//4个属性public int n1 = 100;protected int n2 =200;int n3 = 300;private int n4 = 400;public Base(){//无参构造器System.out.println("base()....");}public void test100(){System.out.println("test100");}protected void test200(){System.out.println("test200");}void test300(){System.out.println("test300");}private void test400(){System.out.println("test400");}public int getn4(){return n4;}public void callTest400(){test400();}
    }
    

    Sub.java:

    package com.hspedu.extend_;public class Sub extends Base{//子类public Sub(){//构造器System.out.println("sub()......");}public void sayOk(){//子类方法//我们发现 父类的非private属性和方法都可以访问System.out.println(n1);System.out.println(n2);System.out.println(n3);test100();test200();test300();//通过父类提供公共的方法去访问System.out.println("n4= " + getn4());callTest400();}
    }
    
  2. 子类必须调用父类的构造器,完成父类的初始化。

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

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

  5. super 在使用时,需要放在构造器第一行(super 只能在构造器中使用)。

  6. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。

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

    使用 Ctrl + H 可以看到类的继承关系。

在这里插入图片描述

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

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

    如何让 A 类继承 B 类和 C 类?===> A 继承 B, B 继承 C。

  3. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系。

继承的本质分析

例子:

ExtendsTheory.java:

package com.hspedu.extend_;/*** 讲解继承的本质*/public class ExtendsTheory {public static void main(String[] args) {Son son = new Son(); //内存的布局是?//注意,要按照查找关系来返回信息//(1)首先看子类是否有该属性//(2)如果子类有这个属性,并且可以访问,则返回信息。//(3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息。)//(4)如果父类没有就按照(3)的规则,继续找上级父类,直到0bject。System.out.println(son.name);System.out.println(son.age);System.out.println(son.hobby);}
}
class GrandPa { //爷类String name = "大头爷爷";String hobby = "旅游";
}
class Father extends GrandPa { //父类String name = "大头爸爸";int age = 39;
}
class Son extends Father { //子类String name = "大头儿子";
}

内存布局:

在这里插入图片描述

练习题

第一题:main 中:B b = new B(); 会输出什么?

在这里插入图片描述

//结果:
a 
b name
b

第二题:main 中:C c = new C(); 会输出什么?

在这里插入图片描述

//结果:
我是A类
hahah我是B类的有参构造
我是c类的有参构造
我是c类的无参构造

第三题:ExtendsExercise03.java

  • 编写 Computer 类,包含CPU、内存、硬盘等属性,getDetails 方法用于返回 computer 的详细信息

  • 编写 PC 子类,继承 Computer 类,添加特有属性【品牌brand】

  • 编写 NotePad 子类,继承 Computer 类,添加特有属性【color】

  • ExtendsExercise03 类,在 main 方法中创建 PC 和 NotePad 对象,分别给对象中特有的属性赋值,以及从 Computer 类继承的属性赋值,并使用方法并打印输出信息。

ExtendsExercise03.java:

package com.hspedu.extend_.Exercise;public class ExtendsExercise03 {public static void main(String[] args) {PC pc = new PC("Intel",16 ,512, "联想");NotePad notePad = new NotePad("Intel", 32, 1024, "灰色");pc.printInfo();notePad.printNotePad();}
}

Computer.java:

package com.hspedu.extend_.Exercise;public class Computer {private String 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 getDetail(){return ("cpu = " + cpu +" memory = " + memory + " 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;}
}

PC.java:

package com.hspedu.extend_.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(){System.out.println("PC 信息如下:");System.out.println(getDetail() + " Brand = " + brand);}
}

NotePad.java:

package com.hspedu.extend_.Exercise;public class NotePad extends Computer{private 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 printNotePad(){System.out.println("NotePad 信息如下:");System.out.println(getDetail() + " Color = " + color);}
}

相关文章:

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…...

不可不知的Java SE技巧:如何使用for each循环遍历数组

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...

机器人建模、运动学与动力学仿真分析(importrobot,loadrobot,smimport)

机器人建模、运动学与动力学仿真分析是机器人设计和开发过程中的关键步骤。 一、机器人建模 机器人建模是描述机器人物理结构和运动特性的过程。其中,URDF(Unified Robot Description Format)是一种常用的机器人模型描述方法。通过URDF&…...

02-QWebEngineView的使用

Qt WebEngine_hitzsf的博客-CSDN博客 一、QWebEngineView QWebEngineView 类是一个实现Web浏览器的便捷类,提供了back() 、forward()、reload()、stop() 等方法,可轻松实现页面的前进、后退、重载等导航功能,要实现一个简单的只有网页加载网…...

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…...

JS中判断一个字符串中出现次数最多的字符,统计这个次数?

在JavaScript中,要判断一个字符串中出现次数最多的字符并统计这个次数,你可以通过创建一个对象来记录每个字符出现的次数,然后遍历这个对象以找到出现次数最多的字符。下面是一个简单的示例代码: function findMostFrequentChar(…...

rust-强化练习

钓鱼不打窝,钓的也不多 语言只靠看不行,还得练,下面是AI生成的一些题目,后续直接肝LeeCode,一举2得 1、猜数字 描述:创建一个简单的猜数字游戏,程序会随机生成一个数字,玩家需要猜出这个数字是…...

TF-IDF算法

TF-IDF算法详解 一、TF-IDF算法概述 TF-IDF(Term Frequency-Inverse Document Frequency)算法是一种常用于信息检索和文本挖掘的加权技术。其基本思想是通过评估一个词在文档中的重要性,来确定这个词在文档集合或语料库中的权重。TF-IDF算法…...

R语言数据分析案例29-基于ARIMA模型的武汉市房价趋势与预测研究

一、选题背景 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响,而房价能够体现经济运转的好坏,因而房价的波动牵动着开发商和购房者的关注,城市房价预测是一个研究的热点问题,研究房价对民生问题具有重要意义。 …...

面试-NLP八股文

机器学习 交叉熵损失: L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差: L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…...

数据仓库之离线数仓

离线数据仓库(Offline Data Warehouse)是一种以批处理方式为主的数据仓库系统,旨在收集、存储和分析大量历史数据。离线数据仓库通常用于定期(如每日、每周、每月)更新数据,以支持各种业务分析、报表生成和…...

Mybatis源码解析

MybatisAutoConfiguration或者MybatisPlusAutoConfiguration核心作用是初始化工厂类SqlSessionFactory,其中包含属性interceptors、MapperLocations、TypeAliasesPackage、TypeEnumsPackage、TypeHandlers等。 MybatisAutoConfiguration自动装配类是由依赖&#xf…...

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…...

【Java】内部类、枚举、泛型

目录 1.内部类1.1概述1.2分类1.3匿名内部类(重点) 2.枚举2.1一般枚举2.2抽象枚举2.3应用1:用枚举写单例2.4应用2:标识常量 3.泛型3.1泛型认识3.2泛型原理3.3泛型的定义泛型类泛型接口泛型方法 3.4泛型的注意事项 1.内部类 1.1概述 内部类:指…...

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式,实现了复杂电子实验操作的虚拟化,不仅提高了学生的操作熟练度和学习兴趣,而且通过智能评价模块提供即时反馈,促进教学和学习的互动。 项目背景 在…...

SVM支持向量机

SVM的由来和概念 间隔最大化是找最近的那个点的距离’ 之前我们学习的都是线性超平面,现在我们要将超平面变成圈 对于非线性问题升维来解决 对于下图很难处理,我们可以将棍子立起来,然后说不定red跑到左边了,green跑到右边了(可能增加了某种筛选条件导致两个豆子分离)(只是一种…...

【Unity】RPG2D龙城纷争(二)关卡、地块

更新日期:2024年6月12日。 项目源码:后续章节发布 索引 简介地块(Block)一、定义地块类二、地块类型三、地块渲染四、地块索引 关卡(Level)一、定义关卡类二、关卡基础属性三、地块集合四、关卡初始化五、关…...

mediamtx流媒体服务器测试

MediaMTX简介 在web页面中直接播放rtsp视频流,重点推荐:mediamtx,不仅仅是rtsp-CSDN博客 mediamtx github MediaMTX(以前的rtsp-simple-server)是一个现成的和零依赖的实时媒体服务器和媒体代理,允许发布,读取&…...

C# 循环

C# 循环 在编程中,循环是一种控制结构,它允许我们重复执行一段代码多次。C# 提供了几种循环机制,以适应不同的编程需求。本文将详细介绍 C# 中常用的几种循环类型,包括 for 循环、while 循环、do-while 循环和 foreach 循环&…...

PHP杂货铺家庭在线记账理财管理系统源码

家庭在线记帐理财系统,让你对自己的开支了如指掌,图形化界面操作更简单,非常适合家庭理财、记账,系统界面简洁优美,操作直观简单,非常容易上手。 安装说明: 1、上传到网站根目录 2、用phpMyad…...

机器学习中的神经网络重难点!纯干货(上篇)

. . . . . . . . .纯干货 . . . . . . 目录 前馈神经网络 基本原理 公式解释 一个示例 卷积神经网络 基本原理 公式解释 一个示例 循环神经网络 基本原理 公式解释 一个案例 长短时记忆网络 基本原理 公式解释 一个示例 自注意力模型 基本原理…...

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂, 挑起存储的大梁。因为内存的存取速度超凡地快, 但内存上的数据掉电又会丢失,一直其中缓存的作用,就像是我们的工…...

享元和代理模式

文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站,type属性是内部状态3.WebSiteFactory.java 网站…...

[英语单词] ellipsize,动词化后缀 -ize

openvswitch manual里的一句话:里面有使用ellipsize,但是查字典是没有这个单词,这就是创造出来的动词。将单词ellipsis,加动词化后缀,-ize。 Often we ellipsize arguments not important to the discussion, e.g.: &…...

自然资源-测绘地信专业术语,值得收藏!

自然资源-测绘地信专业术语,值得收藏! 1、1954年北京坐标系 1954年我国决定采用的国家大地坐标系,实质上是由原苏联普尔科沃为原点的1942年坐标系的延伸。 2、1956年黄海高程系统 根据青岛验潮站1950年一1956年的验潮资料计算确定的平均海面…...

如何在小程序中实现页面之间的返回

在小程序中实现页面之间的返回,通常有以下几种方法,这些方法各有特点,适用于不同的场景: 1. 使用wx.navigateBack方法 描述:wx.navigateBack是微信小程序中用于关闭当前页面,返回上一页面或多级页面的API…...

深入解析数据结构之B树:平衡树中的王者

在计算机科学中,数据结构是算法和程序设计的基础。而在众多数据结构中,B树作为一种平衡树,在数据库和文件系统中有着广泛应用。本文将详细介绍B树的概念、特点、操作、优缺点及其应用场景,帮助读者深入理解这一重要的数据结构。 …...

18. 第十八章 继承

18. 继承 和面向对象编程最常相关的语言特性就是继承(inheritance). 继承值得是根据一个现有的类型, 定义一个修改版本的新类的能力. 本章中我会使用几个类来表达扑克牌, 牌组以及扑克牌性, 用于展示继承特性.如果你不玩扑克, 可以在http://wikipedia.org/wiki/Poker里阅读相关…...

OperationalError: (_mysql_exceptions.OperationalError)

OperationalError: (_mysql_exceptions.OperationalError) (2006, MySQL server has gone away) 这个错误通常表示客户端(例如你的 Python 程序使用 SQLAlchemy 连接到 MySQL 数据库)和 MySQL 服务器之间的连接被异常关闭了。这个问题可能由多种原因引起,以下是一些常见的原…...

DocGraph相关概念

结合简化版的直观性和专业版的深度,我们可以得到一个既易于理解又包含专业细节的DocGraph概念讲解。 DocGraph概述(简化版) 想象DocGraph就像是文章信息的地图。它通过拆分文档、识别关键词、分析关系,并最终以图形方式呈现这些…...

网站建设APP的软件/趣丁号友情链接

3.6 大型企业中的云计算前两节已经介绍过,创业公司和中小型企业都在使用云获得巨大优势。很多情况下,这些小规模组织要么除了把应用部署到云中外没有其他可行方案,要么就是因为云解决方案明显的成本优势而显得采用其他部署方案没有意义。小规…...

自己做网站教程/seo的形式有哪些

1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 该函数的第一…...

网络编程有哪些/百度搜索优化

焦红伟,博士,副教授,硕士生导师,河南省高校青年骨干教师。2015年毕业于西安电子科技大学,获理学博士学位。主要从事最优化算法及应用、系统优化、智能优化算法及应用等方面的研究工作。近年来对非凸规划问题的全局优化…...

长春公司网站建设/百度seo2022新算法更新

linux安装Navicat,界面出现乱码解决方法 (转发)参考文章: (1)linux安装Navicat,界面出现乱码解决方法 (转发) (2)https://www.cnblogs.com/miao…...

沧州网站制作公司/seo优化方案策划书

我想要向您介绍能想像到的开始 GUI 编程的最简单方法,就是使用 Scriptics 的 TK 和 Tkinter 封装器。我们将与 developerWorks 中的 “Python 中的 curses 编程” 提到的 curses 库进行很多比较。除了 curses 实现文本控制台而 TK 实现 GUI 这一差别之外&#xff0c…...

中联网站建设/优化设计答案

配置环境:centos 6.6、redhat9、hadoop1.0.3、jdk1.6 基本配置:这里选择了cento6.6作为master,redhat9是slave 基于单节点伪分布式配置(参考单节点的配置),修改其配置: step1:在master的配置&am…...