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.mzph.cn/web/27479.shtml

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

相关文章

虚拟淘宝-Virtual-Taobao论文解读(AAAI2019)

目录 1 论文简介 2 文章的主要贡献 3 文章技术的简要说明 4 技术的详细说明 4.1 GAN-SD:生成客户特征 4.2 MAIL:生成交互过程 4.3 ANC:动规范约束 5 实验设定及结果 6 结论 7 参考 1 论文简介 南京大学LAMDA团队的侍竞成、俞扬等…

【服务器硬件由 CPU、RAM、硬盘等组成,选购时需考虑应用需求、预算等。散热、安全、监控与维护亦重要,未来发展趋势包括高性能、低能耗和智能化。】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

MySQL----索引的底层实现和原理

索引 在前面的文章中,我们分析了索引的分类、创建、删除以及索引的创建原则等,知道了创建索引的目的就是为了加速对表中的数据行的检索而创造的一种分散存储的数据结构。那么索引的底层结构是什么呢? 底层实现 数据库索引是存储在磁盘上的…

PDF标准详解(三)—— PDF坐标系统和坐标变换

之前我们了解了PDF文档的基本结构,并且展示了一个简单的hello world。这个hello world 虽然只在页面中显示一个hello world 文字,但是包含的内容却是不少。这次我们仍然以它为切入点,来了解PDF的坐标系统以及坐标变换的相关知识 图形学中二维…

OpenCV学习(4.15) 基于 GrabCut 算法的交互式前景提取

1. 目标 在这一章当中 我们将看到 GrabCut 算法来提取图像中的前景我们将为此创建一个交互式应用程序。 2. 理论 GrabCut 算法由英国剑桥微软研究院 Carsten Rother,Vladimir Kolmogorov和Andrew Blake发明,并在他们的论文“GrabCut”:使…

LLM之RAG实战(四十)| 使用LangChain SQL Agent和MySQL搭建多层RAG ChatBot

在传统的意义上,RAG 主要是从文档中检索用户想要的数据,从而提高大模型的能力,减少幻觉问题。今天,我们从另一个维度介绍RAG,RAG不从文档中获取数据,而是从MySQL数据库检索数据。我们可以使用LangChain SQL…

Vue40-vueComponent构造函数

一、组件的本质:VueComponent构造函数 组件的本质是:构造函数 二、每一次调用vue.extend,返回的事一个全新的 VueComponent VueComponent的源码如下: 三、组件中的this 组件中的this是VueComponent实例对象,结构和vm…

如果给电商系统颜值搞排名,我觉得淘宝千牛系统是天花板了。

淘宝的商家操作界面-千牛系统经过多年的迭代,无论从颜值上、功能上还是用户体验上都是行业天花板的存在,我截图软件上的一些图给大家分享下。

网络编程之XDP和TC

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

foxmai邮箱使用技巧图文板简单容易,服务器配置密钥配置

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持&#xf…

手把手教你实现条纹结构光三维重建(2)——条纹解码

在第一讲中,我们讲到了条纹的生成,这一讲,我们将实现条纹的解码。我们这里的解码技术很简单,即高低频倍数解码,详细的论文可以参考:《Temporal phase unwrapping algorithms for fringe projection profilo…

基于 Transformer 的大语言模型

语言建模作为语言模型(LMs)的基本功能,涉及对单词序列的建模以及预测后续单词的分布。 近年来,研究人员发现,扩大语言模型的规模不仅增强了它们的语言建模能力,而且还产生了处理传统NLP任务之外更复杂任务…

4-字符串-11-反转字符串-LeetCode344

4-字符串-11-反转字符串-LeetCode344 LeetCode: 题目序号344 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文&#xff0…

认识一些分布函数-Frechet分布及其应用

1. 何为Frechet分布 Frechet分布也称为极值分布(EVD)类型II,用于对数据集中的最大值进行建模。它是四种常用极值分布之一。另外三种是古贝尔分布、威布尔分布和广义极值分布(Gumbel Distribution, the Weibull Distribution and the Generalized Extreme Value Distributi…

亿达中国武汉园区入选“武汉市科技金融工作站”及“武汉市线下首贷服务站”

近日,武汉市2024科技金融早春行活动在深交所湖北资本市场培育基地举行。会上,第四批武汉市科技金融工作站试点单位名单及第五批武汉地区金融系统线下首贷服务站名单正式公布,武汉软件新城成功入选上述两个名单。 为缓解科技型企业融资难题&a…

vue2+echarts实现简易的2d地图效果

背景 公司的一个可视化数据大屏里面,有一个使用echarts实现的2d地图。不是我开发的,在此记录一下实现过程以及一些扩展解构。应该是从哪个航空航线图改动了一下,效果看起来还是可以的。 效果预览 版本 vue版本使用的是"^2.6.12"…

我要成为算法高手-双指针篇

目录 什么是双指针?问题1:移动零问题2:复写零问题3:快乐数问题4:盛最多水的容器问题5:有效三角形个数问题6:查找总价格和为目标值的两个商品(两数之和)问题7:三数之和问题8:四数之和…

私域流量新利器:大模型+智慧客服+知识智能多管齐下,效果倍增!

前言 随着互联网环境的发展,线上市场竞争日益激烈,越来越多的企业开始关注私域流量的运营和管理——将品牌的用户数据在品牌官网、微信公众号、APP等自有平台上进行管理和运营,通过与用户建立深入的关系和互动,提升用户黏性、增强…

LNMP搭建:Linux+Nginx+MySQL+PHP

关闭防火墙和核心防护,使用一台机器Node1搭建LNMP systemctl stop firewalld; setenforce 0 所需源码包:可以去官网下载 编译Nginx 创建/data,在/data/下放源码包 [rootNode1 ~]#:mkdir /data;cd /data 安装依赖包 [rootNode1 data]#:yum …

第一个SpringBoot程序

第一个SpringBoot程序 目录介绍 当我们创建了一个SpringBoot项目之后,会出现如下的目录结构 SpringBoot项⽬有两个主要的⽬录: src/main/java: Java源代码 src/main/resources:为静态资源或配置⽂件: /static:静态资源⽂件夹,⽐…