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);}
}

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

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

相关文章

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA,需要先按照Graphql插件,步骤如下: (1)打开插件管理 在IDEA中,打开主菜单,选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

【最新鸿蒙应开发】——HarmonyOS沙箱目录

鸿蒙应用沙箱目录 1. 应用沙箱概念 应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为应用沙箱目录。 对于每个应用,系统会在内部存储空间映射出一个专属的应用沙箱…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前,我们要知道linux是一个操作系统。 那操作系统是什么呢?(这里只做大概了解) 操作系统就是一个管理软硬件的软件。 它对上提供良好(稳定、高效、安…

Java面试题--JVM大厂篇之掌握JVM性能优化:选择合适的垃圾回收器

掌握JVM性能优化:选择合适的垃圾回收器 引言: ​  在Java开发中,性能优化往往是提高应用稳定性和用户体验的关键所在。而垃圾回收器的选择和优化,是JVM性能调优的核心环节。如何在众多垃圾回收器中选出适合自己应用需求的那一个&#xff1…

在Kubernetes中部署Elasticsearch高可用集群详细教程

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

网络编程之XDP和TC

一、TC之于XDP 在前面分析过XDP,今天简单分析一下与其相关的TC,即traffic control,流量控制。在分析XDP时知道其只能用于ingress方向触发,而TC却可以在两个方向即ingress和egress方向触发。也可以简单理解成它可以同时钩住进出两个方向的数据…

网络安全(补充)

物理安全威胁一般分为自然安全威胁和人为安全威胁。自然安全威胁包括地震、洪水、火灾、鼠害、雷电;;;;人为安全威胁包括盗窃、爆炸、毁坏、硬件安全防火墙白名单策略:只允许符合安全规则的包通过防火墙,其…

算法day31

第一题 542. 01 矩阵 本题本来求解的是每一个1到0的最短距离并返回到矩阵之中; 我们采用正难则反的思路,将其化解为每一个0到每一个1的最短距离,并通过矩阵来返回; 解法:多源bfs正难则反 步骤一: 定义一个…

STM32单片机选型方法

一.STM32单片机选型方法 1.首先要确定需求: 性能需求:根据应用的复杂度和性能要求,选择合适的CPU性能和主频。 内存需求:确定所需的内存大小,包括RAM和Flash存储空间。 外设需求:根据应用所需的功能&…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站,不得不说这是一个神奇的网站,在这个网站上你可以实现不可思议的各种操作,让我们对网站有了新的认知,因为它告诉你不是所有有趣的网站都那么花哨,有些网站看着外形平淡无奇…

【工业自动化领域解决方案】利用Profishark工具捕获EtherCAT报文

随着工业自动化技术的不断进步,对于实时数据捕获和分析的需求也在增加。尤其在EtherCAT这样的高性能工业网络中,精准的报文捕获和分析工具显得尤为重要。在这篇文章中,我们将深入探讨如何利用ProfiShark工具捕获EtherCAT报文,并展…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络(FFN)2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

Sentence Transformers x SwanLab:可视化Embedding训练

Sentence Transformers(又名SBERT)是访问、使用和训练文本和图像嵌入(Embedding)模型的Python库。 你可以使用Sentence Transformers快速进行模型训练,同时使用SwanLab进行实验跟踪与可视化。 1. 引入SwanLabCallback from swanlab.integra…

XSS攻击

黑客怎么拿到你的cookies呢? 浏览器可以执行脚本 网站有留言板 黑客发现留言板有xss漏洞,没有做过滤 一般就是网络管理员登录后台查看留言数据,然后就会产生cookies 然后之前黑客留言的东西就包含恶意的程序(不仅写了留言&am…

运维系列.在Docker中使用Grafana

运维专题 在Docker中使用Grafana - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_2855026…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5400 标注数量(xml文件个数):5400 标注数量(txt文件个数):5400 标注…

AI图书下载:《ChatGPT打造赚钱机器》

这本书《ChatGPT打造赚钱机器》(ChatGPT Money Machine 2024 The Ultimate Chatbot Cheat Sheet)是一本全面的指南,旨在帮助读者快速掌握如何利用ChatGPT等人工智能技术创造收益。 以下是各章节内容的总结: **引言** 介绍了人工智…

docker环境中配置phpstorm php xdebug调试工具

本文介绍通过docker compose的使用方式 第一步:在php镜像中安装phpxdebug扩展,比如php7.4对应的是xdebug3.1.6 第二步:设置项目中的docker-compose.yml docker-compose 增加开启xdebug的环境变量,host.docker.internal是宿主机的地址&#…

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统(Hospital Information System简称HIS)是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…

Aivis:AI声音模仿系统的创新之旅

在人工智能技术的不断进步中,声音合成技术也迎来了新的发展机遇。Aivis项目正是这一领域的杰出代表,它提供了一个全流程的工具,让用户能够从数据集的创建到学习再到推理,一站式地生成逼真的语音。 Aivis是一个基于Bert-VITS2模型的…