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

Java 继承

文章目录

    • 1. 继承概述
    • 2. 变量的访问特点
    • 3. super 关键字
    • 4. 构造方法的访问特点
    • 5. 成员方法的访问特点
    • 6. 方法重写
    • 7. 继承案例

1. 继承概述

继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

public class 子类名 extends 父类名 {}

继承中子类的特点:
① 子类可以有父类的内容;
② 子类还可以有自己特有的内容。

父类也被称为基类或超类,子类也被称为派生类。

//Father.javapackage com.zxe;public class Father {public void show() {System.out.println("show方法被调用了!");}
}
//Son.javapackage com.zxe;public class Son extends Father {public void method() {System.out.println("method方法被调用了!");}
}
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {Son son = new Son();son.method();son.show();}
}

在这里插入图片描述

(1)继承的好处和弊端:
① 好处,提高了代码的复用性和维护性;
② 弊端,继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。
(2)什么时候使用继承?
假设我有两个类 A 和 B,如果它们之间满足 A 是 B 的一种,或者 B 是 A 的一种,就说明它们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承。(比如,苹果和水果,猫和动物,它们之间就存在着继承关系)

Java 中只支持单继承不支持多继承,也就是说一个类不能同时继承多个类,但 Java 支持多层继承,比如儿子继承父亲,父亲又继承爷爷,那么儿子也继承爷爷!

2. 变量的访问特点

在子类方法中访问一个变量,先在子类局部范围找,找不到再去子类成员范围找,还找不到就去父类成员范围找,如果父类成员范围中依然找不到,程序就会报错。(不考虑父亲的父亲)

//Father.javapackage com.zxe;public class Father {int age = 20;
}
//Son.javapackage com.zxe;public class Son extends Father {int age = 30;public void method() {int age = 40;System.out.println(age);}
}

这里的输出结果就是40。

3. super 关键字

根据上面的变量访问特点,我们知道案例最终的输出结果在子类的局部范围中,如果我们现在想要得到的是 age = 30 呢?访问子类成员变量用 this.age 即可,那么在子类中访问父类的成员变量就使用 super.age,即 age = 20。

4. 构造方法的访问特点

子类中所有的构造方法默认都会访问父类中无参的构造方法。 因为子类会继承父类中的数据,可能还会使用父类的数据,所以子类在初始化之前,一定要先完成父类数据的初始化,每个子类构造方法的第一条语句默认都是 super()。

如果父类中没有无参构造方法,只有带参构造方法时,该怎么办呢?
① 通过使用 super 关键字去调用父类的带参构造方法,super(12);
② 在父类中手动提供一个无参构造方法,推荐使用。

5. 成员方法的访问特点

通过子类对象访问一个方法,先到子类成员范围找,再到父类成员范围找,如果都没有就报错,同样不考虑父亲的父亲。
当父类和子类中的方法同名时,那么程序访问的是子类中的方法,如果想要访问父类中的同名方法,可以使用 super 关键字,super.show()。

6. 方法重写

方法重写:子类中出现了和父类中一模一样的方法声明。
当子类需要父类的功能,而功能主体子类有自己的特有内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。

//Phone.javapackage com.zxe;public class Phone {public void call(String name) {System.out.println("给" + name + "打电话!");}
}
//NewPhone.javapackage com.zxe;public class NewPhone extends Phone {@Overridepublic void call(String name) {System.out.println("开启视频功能!");super.call(name);}
}
//PhoneDemo.javapackage com.zxe;public class PhoneDemo {public static void main(String[] args) {NewPhone p = new NewPhone();p.call("张三");}
}

在重写方法之前加上 @Override 注解,可以帮助我们检验重写方法的声明是否正确,不正确就会报错!

注意事项:
① 私有方法不能被重写(父类私有成员子类是不能继承的);
② 子类方法的访问权限要比父类高(public > 默认 > 私有)。

7. 继承案例

需求:定义老师类和学生类,然后写代码测试,最后找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试。
思路:
① 定义老师类,姓名,年龄,教书();
② 定义学生类,姓名,年龄,学习();
③ 定义测试类;
④ 共性抽取父类,定义人类,姓名,年龄;
⑤ 老师类继承人类,并给出自己特有的方法,教书();
⑥ 学生类继承人类,并给出自己特有的方法,学习()。

这里普及一下快速补全代码按键:
① psvm,快速生成测试类的 main 方法;
② Alt + Insert,快速补全构造方法及 Get / Set 方法,Constructor 里面 Ctr + A 全选即有参构造,点击下面的 Select None 即无参构造,Getter and Setter 里面全选中即可自动补全 Get / Set 方法。

在这里插入图片描述
在这里插入图片描述

//Person.javapackage com.zxe;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
//Student.javapackage com.zxe;public class Student extends Person {public Student() {}public Student(String name, int age) {super(name, age);}public void study() {System.out.println("我爱学习!");}}
//Teacher.javapackage com.zxe;public class Teacher extends Person {public Teacher() {}public Teacher(String name, int age) {super(name, age);}public void teach() {System.out.println("我爱教书!");}
}
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {Student s = new Student("张三", 14);System.out.println(s.getName() + s.getAge());s.study();Teacher t = new Teacher("王四", 36);System.out.println(t.getName() + t.getAge());t.teach();}
}

也可用 set 方法给对象赋值,有参构造时由于 Person 设置了访问权限,子类无法继承到父类的变量,所以我们通过 super(name, age) 的方法来注入对象的属性值。

相关文章:

Java 继承

文章目录1. 继承概述2. 变量的访问特点3. super 关键字4. 构造方法的访问特点5. 成员方法的访问特点6. 方法重写7. 继承案例1. 继承概述 继承是面向对象三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。 publ…...

Python学习笔记8:异常

异常 一些内置的异常类 类名描述Exception几乎所有的异常类都是从它派生而来的AttributeError引用属性或给它赋值失败时引发OSError操作系统不能执行指定的任务(如打开文件)时引发,有多个子类IndexError使用序列中不存在的索引时引发&#…...

python保留小数函数总结

python保留小数——‘%f’‘%.nf’% x(定义的变量) 例子:a 82.16332 print(%.1f% a) print(%.2f% a) print(%.3f% a) print(%.4f% a) print(%.10f% a)输出结果python保留小数——format()函数Python2.6 开始&#xff…...

狐狸优化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

浏览器自动化框架沦为攻击者的工具

5月27日消息,安全公司Team Cymru的研究人员表示,越来越多的威胁参与者正在使用免费的浏览器自动化框架作为其攻击活动的一部分。 研究人员表示,该框架的技术准入门槛故意保持在较低水平,以创建一个由内容开发者和贡献者组成的活跃…...

SQL必备知识(自用)

数据库基础知识sql和mysql的区别:数据库查询大全(select)1、select 字段名 from 表;2、In查询:用于过滤你所需要查询的内容3、范围查询:between4、模糊查询:like5、查询空值/非空:is…...

BI工具术语表大全:从字母A-Z全面收录

谈到商业智能行业,变革是不可避免的。为了跟上步伐,各种各样的BI 解决方案正在快速迭代更新,以满足企业的数字化需求,那么市场上BI 工具种类繁杂,到底如何选择适合功能全面、满足自己企业运转情况的、合适的BI 工具呢&…...

vue3 + vite + ts 集成mars3d

vue3 vite ts 集成mars3d 文章目录vue3 vite ts 集成mars3d前言一、创建一个vue3 vite ts项目二、引入mars3d相关依赖三、vite.config.ts 相关配置四、 新建DIV容器 创建地图前言 使用mars3d过程中,需要集成mars3d到自己的项目中,mars3d开发教程…...

跨境卖家必看的沃尔玛Walmart商家入驻教程

沃尔玛Walmart作为作为全球连锁超市的鼻祖,有不可比拟的知名度。当沃尔玛从线下延伸到线上后,就成为一个自带IP与流量的线上平台,在全世界都拥有数量庞大的消费者群体。所以龙哥就结合自己注册Walmart的过程给大家详细讲解一下。 Walmart卖家…...

【GANs】什么是饱和损失函数 Non-Saturating LossFunction

Saturating VS Non-Saturating Loss functions in GANs【GANs】什么是饱和损失函数 Non-Saturating LossFunctionSaturating VS Non-Saturating Loss functions in GANs 饱和Loss 普通GAN loss是生成器希望最小化被判断为假的概率。x取值范围是[0,1],所以图中函数…...

USB接口虚拟网卡

1 基本概念 1.1 USB转以太网 - ASIX 4-byte length header before every ethernet packet. - Microchip LAN7800 128x32 bit Descriptor RAM, 32 bits DP_DATA address offset 030h for Descriptor RAM access. - Windows CMD参数格式: route /? -> Linux -h …...

基于SpringBoot的外卖项目的优化

基于SpringBoot的外卖项目的优化1、缓存优化1.1、缓存短信验证码问题分析代码改造1.2、缓存菜品数据实现思路1.3、Spring Cache介绍常用注解CachePutCacheEvictCacheable使用方式1.4、缓存套餐数据实现思路代码改造2、读写分离2.1、主从复制存在的问题介绍配置配置主库--master…...

Ubuntu20.04/22.04 ESP32 命令行开发环境配置

ESP32 芯片系列 ESP32分三个系列 ESP32-S ESP32-S3: Xtensa 32位 LX7 双核 240 MHz, 384KB ROM, 512KB SRAM, QFN7x7, 56-pin, 2.4G Wi-Fi BTESP32-S2: Xtensa 32位 LX7 单核 240 MHz, 128KB ROM, 320KB SRAM, QFN7x7, 56-pin, 2.4G Wi-Fi ESP32-C ESP32-C3: RISC-V 32位 单…...

Kali Linux使用Metasploit生成木马入侵安卓系统

额,这是我最后一篇文章了,周一我们开学了 文章目录前言一、Metasploit是什么?演示环境二、生成可执行木马文件1.生成2.运行命令并生成木马配置参数入侵安卓手机命令1.查看对方手机系统信息查看对方手机安装哪些app文件总结前言 前言&#xf…...

数据库复习1

一. 简答题(共1题,100分) 1. (简答题) 存在数据库test,数据库中有如下表: 1.学生表 Student(Sno,Sname,Sage,Ssex) --Sno 学号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 主键Sno 2.教师表 Teacher(Tno,Tname) --T…...

18. linux系统基础

shell 命令解析器 命令解析器作用: 他把在终端上输出的命令 给你解析成内核可以识别的指令,内核 是经过命令解析器的加工 shell在找命令的时候,所包含的路径,就是在这些路径里去 找 找到就执行 找不到就报错 报错 要么 这个命…...

ssh远程登录报错:kex_exchange_identification: Connection closed by remote host

基本信息系统:MacOS Catalina 10.15.7报错信息:终端登录远程服务器时报错:kex_exchange_identification: Connection closed by remote host复制然而服务商的一键登录或VNC登录正常。解决方案首先使用以下命令debug登录过程,以便定…...

Quartus II 的入门级使用

好久没有用VHDL写东西了,今天需要完成一个项目,重新复习一下新建工程新建工程file-->New Project Wizard, next, 选择存放的路径名字(projecttop-level 名字要相同),next,File name名字同上,…...

Java EE|TCP/IP协议栈之TCP协议工作机制上

文章目录前言一、确认应答二、超时重传三、连接管理三次握手四次挥手前言 前边,我们已经大概交代了TCP的报文结构。但是仍有一些字段我们不确定到底怎么理解,这里就分析TCP的内部工作机制了。 TCP的内部很复杂,有很多机制,这里我们…...

智能化人机协作 遮挡情况下准确识别目标信息

研究背景 废旧产品(end-of-life products)的拆卸是工程全生命周期管理的一个基本步骤。在减少资源消耗和温室气体排放的同时,回收可重复使用的部件可能创造相当的经济价值,同时也能推动碳中和目标的实现。 但目前EoL的拆卸仍然严…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...