Java学习 --- 面向对象-继承

news/2024/5/19 12:58:46/文章来源:https://blog.csdn.net/a1404359447/article/details/127183307

一、为什么需要继承

我们编写了两个类,一个是Pupil类,一个是Graduate类

问题:两个类的属性和方法有很多是相同的,怎么办?

Pupil类:

package com.javase.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 showInfo() {System.out.println("学生姓名" + name + " 年龄 " + age + " 成绩 " + score);}
}

Graduate类:

package com.javase.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 showInfo() {System.out.println("学生姓名" + name + " 年龄 " + age + " 成绩 " + score);}
}

两个类的代码中属性以及功能都是重复的,代码复用性低。

二、什么是继承

基本介绍:

继承可以解决代码复用,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。

基本语法:

class 子类 extends 父类 {

}

1、子类会自动拥有父类定义的属性和方法

2、父类又称超类或基类

3、子类又称派生类

示意图: 

使用继承解决代码复用问题:

Student父类

package com.javase.extend_.improve;
//父类  Pupil和Graduate的分类
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);}}

Pupil类 

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

Graduate类

package com.javase.extend_.improve;public class Graduate extends Student{//考试public void testing() {System.out.println("学生" + name + "正在考小学数学");}
}

输出:

package com.javase.extend_.improve;public class Extends01 {public static void main(String[] args) {Pupil p = new Pupil();p.name = "张三";p.age = 10;p.testing();p.setScore(60);p.showInfo();System.out.println("========");Graduate g = new Graduate();g.name = "李四";g.age= 20;g.testing();g.setScore(100);g.showInfo();}
}

继承的好处:

1、代码复用性提高了 

2、代码的扩展性和维护性提高了

三、继承的使用细节和注意事项

1、子类继承了所有的属性和方法,私有属性不能在子类直接访问,但是非私有属性能在子类直接访问,通过父类提供公共的方法去访问私有属性和方法。

父类Base

package com.javase.extend_.improve;public class Base {//父类//四个属性public int n1 = 100;protected int n2 = 200;int n3 = 300;private int n4 = 400;public Base() {//无参构造器System.out.println("base()...");}//父类提供一个public的方法,返回n4,用来访问私有的属性public int getN4() {return n4;}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 void setN4() {test400();}
}

子类Sub

package com.javase.extend_.improve;public class Sub extends Base {public Sub() {System.out.println("Sob()...");}public void sayOk() {//子类方法//非私有的属性和方法可以在子类直接访问//但是私有属性和方法不能直接在子类访问System.out.println(n1 + " " + n2 + " " + n3 + " " + getN4());test100();test200();test300();//test400();报错setN4();}
}

输出:

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

 2、子类必须调用父类的构造器,完成父类的初始化 

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

情况一:不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器

调用两个构造器:

运行结果:

情况二 : 如果当父类没有提供无参构造器,则必须在子类的构造器中使用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不通过

子类编译会报错

 

需要用super去指定父类构造器

 运行:

调用了父类有参构造器 

4、如果要指定去调用父类的某个构造器,需要用super显示调用

5、super在使用时,必须放在构造器第一行。注意:super只能在构造器中使用

不在第一行会报错

 

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

7、Java所有类都是Object类的子类,Object是所有类的父类或基类。

在idea中ctrl + H可以查看类的关系 

8、父类构造器的调用不限于直接父类,将一直往上追溯直到Object类。

9、子类最多只能继承一个父类(直接继承),在Java中是单继承机制。

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

四、继承的本质

案例演示:

package com.javase.extend_;public class ExtendsThory {public static void main(String[] args) {}
}class GradPa {String name = "大头爷爷";String hobby = "旅游";
}
class Father extends GradPa {String name = "大头爸爸";int age = 30;
}
class Son extends Father {String name = "大头儿子";
}

当子类对象创建好后,建立查找关系。

1、首先看子类中是否具有需要的属性。

2、当子类中有需要的属性,并且可以访问,就返回信息

3、当子类中没有我们需要的属性,就需要到父类中查找是否有我们需要的属性,并且可以访问,就返回信息。

4、当父类中没有我们需要的属性,就继续往上一级查找,直到Object类。
 

内存图:

五、入门练习 

练习一 :

输出结果:

a

b name

b

练习二:

输出结果:

我是A类

hahah我是B类有参构造

我是C类有参构造

我是C类无参构造

练习三:

Computer类:

package com.javase.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 getDetails() {return "CPU=" + cpu + " 内存=" + memory + " 硬盘=" + 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类:

package com.javase.extend_.exercise;//编写Pc子类,继承Computer类,添加特有属性
public class Pc extends Computer {private String brand;//IDEA根据继承的规则,自动把构造器的调用写好//这里也体现:继承设计的基本思想:父类的构造器完成父类属性初始化//子类的构造器完成子类的属性初始化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;}}

NotePad类:

package com.javase.extend_.exercise;import javax.sound.midi.Soundbank;public class NotePad extends Pc{private String color;public NotePad(String cpu, int memory, int disk, String brand, String color) {super(cpu, memory, disk, brand);this.color = color;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public void printInfo() {System.out.println("电脑信息如下:");System.out.println(getDetails());System.out.println("品牌=" + getBrand());System.out.println("颜色=" + color);}
}

输出:

package com.javase.extend_.exercise;public class ExtendsExercise03 {public static void main(String[] args) {NotePad notePad = new NotePad("intle:i5-8700", 16, 256, "ROG", "黑色");notePad.printInfo();}
}

 

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

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

相关文章

docker搭建2048小游戏

下载2048游戏包 链接: https://pan.baidu.com/s/1E5RkGgfLSo3XYmvJ7RId_Q 提取码: 1gc5 复制这段内容后打开百度网盘手机App,操作更方便哦 打包成镜像 [root@docker ~]# ls game2048.tar [root@docker ~]# docker load -i game2048.tar [root@docker ~]# docker images REPOSI…

10月7日第壹简报,星期五,农历九月十二

10月7日第壹简报,星期五,农历九月十二1. 2022年诺贝尔文学奖揭晓,82岁法国女作家埃尔诺获奖。2. 我国新添4处世界灌溉工程遗产:四川省通济堰、江苏省兴化垛田灌排工程体系、浙江省松阳松古灌区和江西省崇义县上堡梯田全部申报成功…

【C语言】学生考勤管理系统

✅作者简介:一位CSDN万粉博主的小娇妻,一名在读大二学生,希望大家多多支持👍👍👍 🔥系列专栏:C语言 💬个人主页:梦园的CSDN博客 学生考勤管理系统1 问题描述2…

使用Vue和SpringBoot开发实验室耗材智能运维系统

作者主页:Designer 小郑 作者简介:浙江某公司软件工程师,负责开发管理公司OA、CRM业务系统,全栈领域优质创作者,CSDN学院、蓝桥云课认证讲师,开发过20余个前后端分离实战项目,主要发展方向为Vue…

(附源码)计算机毕业设计ssm大学生社团管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SPAFA 和Dijkstra的区别

Dijkstra算法和SPFA算法都可以用于求单源最短路,前者可以用小根堆进行优化,后者用就是用队列优化过的Bell-man Ford,下面说一说这两者的区别: Dijkstra算法是基于贪心和DP的思路,一开始先将所有点到原点的距离设置为无穷大,特别的是dis[s]=0,此处的s为原点,它是每次找到…

基于Java的SQL Server数据库加解密系统设计与实现

目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 数据库加解密系统开发背景 3 1.2 国内外现状 3 1.3 本文的主要工作 4 1.4 论文的组织结构 4 第2章 数据库加密的基本理论 6 2.1 数据库加密的三种级别 6 2.2 数据库加密的粒度 8 2.2.1 数据库级的数据库加密 8 2.2.2 表(…

(附源码)SSM药品销售平台设计与实现JAVA计算机毕业设计项目

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

python读写操作redis数据库

python读写操作redis数据库 redis有16个逻辑数据库(编号db0到db15),每个逻辑数据库数据是隔离的,默认db0。选择第n个逻辑数据库,命令select n ,python连接时可指定数据库编号(0~15)…

【Linux内核】内存管理——内核的内存分区

转载请注明: https://www.cnblogs.com/Ethan-Code/p/16619091.html 内核的内存分区 32位机中的虚拟内存大小为4GB,其中0~3GB用于用户空间,3~4GB用于内核空间。 内核的内存空间只有1G,这一部分内存在进程中共享,与用户空间隔离&…

WSL2和Docker使用GPU

文章目录安装Docker-Desktop简单配置dockerwin10安装支持WSL2的nvidia驱动ubuntu配置 CUDA ToolkitGPU测试及问题处理安装Docker-Desktop 安装Docker-Desktop Docker-Desktop下载地址 :https://www.docker.com/products/docker-desktop/ 接着就一路无脑安装即可。 下载完成之…

PTA - 数据库合集10

目录 10-52 查询姓‘李’的学生记录 10-54 查询所有学生的平均成绩 10-67 sql-insert-sample 10-68 sql-delete-sample 10-72 单表查询:根据运费查询订单信息 10-52 查询姓‘李’的学生记录 分数 5 全屏浏览题目 切换布局 作者 张庆 单位 集美大学 本题目要…

MaxViT实战:使用MaxViT实现图像分类任务(一)

MaxViT实战摘要安装包安装timm数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集摘要 MaxViT,是今年谷歌提出分层Transformer的模型,将注意力模型与卷积有效地融合在一起。在图像分类方面,MaxViT 在各种设置下都达到了最先进的性能&…

数据结构子KMP算法

传统从主串找子串方法 然子串从第一个开始,一个个比对,相同比对第二个字母 不同然子串后移一位重新开始比较 直至找到全部相同的或者主串里面没有让子串比较的字母了 这样的算法太暴力,执行效率太低 KMP算法 来说我们人脑对于字符串匹配的…

Linux第三章——用户与组管理

用户与组账号 一个用户可以隶属于不同的组一个组可以包含若干用户系统通过账户对用户与组进行管理 账号 Linux系统账号分为用户账号和组账号 用户账号:每个系统的操作者拥有一个用户账号,每个用户账号具有唯一的标识UID和自己所属组的标识GID。组账号…

【Android-JetpackCompose】5、三阶段:组合、布局、绘制,架构分层,设计原则、性能最佳实践

文章目录一、帧的3个阶段1.1 第 1 阶段:组合1.2 第 2 阶段:布局1.3 第 3 阶段:绘制二、读取 state2.1 优化读取 state三、重组循环(循环阶段依赖项)四、架构分层五、设计原则5.1 控制5.2 自定义六、性能最佳实践6.1 使…

c++类和对象

前言 在学习完漫长的C语言,那么这篇文章也算是开始踏上了高级语言之路 。古人云:路漫漫其修远兮,吾将上下而求索。c的道路才开始,那么我们应该为此开始思考了。余甚 愚,余认为c有太多细节了,必定耗时细磨才…

实验一:贝叶斯神经网络及其如何用随机梯度马尔可夫链蒙特卡洛有效训练

0.实验环境搭建: 源代码获取: 来源一:google 来源二:web 来源三:github 环境: conda create --name python36_google_deep python3.6 conda activate python36_google_deep #建议按照顺序安装 pip inst…

基于FPGA的图像边缘检测

基于FPGA的图像边缘检测一、图像处理算法1.灰度转换2.高斯滤波3.二值化4.Sobel二、项目框架1.摄像头配置模块2.图像处理模块3.数据缓存模块4.其它模块三、部分代码1.数据采集模块2.读写控制模块四、参考五、源码简介:基于FPGA,摄像头实时采集图像数据&am…

【Algorithm】Karatsuba Multiplications 乘法算法

Karatsuba Multiplications Q1: 请计算:x1234x1234x1234, y5678y5678y5678, x∗y?x*y?x∗y? 这个问题其实我们在三年级的时候就学过,用乘法竖式进行运算。但是有没有其他的方法,或者说,如果 x,yx,yx,y 非常大的时候…