关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识,但是并不全,每篇博客之间的知识都有互串,所以需要把几篇文章合起来看,学会融会贯通!

温馨提示:使用PC端观看,效果更佳! 

目录

1.继承是什么

2.什么时候用到继承

3.如何实现继承

4.关于对象的访问

​编辑

5.使用super关键字访问父类

6.父类构造方法

7.介绍protected

8.final关键字


1.继承是什么

(1)在现实生活中,我们都听说过子承父业这个词,这种也叫继承。

(2)某某小孩很顽皮,这肯定是继承了他爸的基因

那么在计算机中,继承是怎么样的呢?

(1)一个类继承了另一个类,这称为继承;前者成为子类,而后者就是父类

(2)继承机制是面向对象程序设计使代码可以复用的最重要的手段,允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生的类,称为派生类。

2.什么时候用到继承

(1)当几个类中有较多重复的代码时;当两个类的属性很相近时。

(2)例如:

这个时候我们可以用到继承

3.如何实现继承

(1)语法

继承使用到关键字:extends

class 类名 extends 类名 {}

(2)示例

class Animal {public String name;public int age;public void eat() {System.out.println("正在吃");}
}
class dog extends Animal {public String color;public void doing() {System.out.println("正在旺旺叫");}
}
class Cat extends Animal{public void doing() {System.out.println("正在喵喵喵");}
}

(3)作用

这样就完成了对共性的抽取,实现了代码的复用

4.关于对象的访问

 下面做一些测试,观察默认情况下是如果访问的

(1)子类和父类中不存在相同的变量名字

(2)子类和父类中存在相同变量名字

结果:

直接访问,访问到的是子类中的变量

(3)访问成员方法

结果:

同样,如果子类和父类中存在相同的名字,优先访问子类

(4)访问父类私有成员

我们都知道,当被private修饰之和,直接访问权限就被限制在了同一个类中;那如果是继承它的子类呢?

1)直接访问

2)间接访问

(5)总结

 1)通过子类对象的引用,去访问子类和父类中不存在相同名字的变量和方法时,优先在子类中寻找,若子类中不存在该变量或者方法时,才会到父类中寻找,若都不存在,则编译报错。

2)通过子类对象的引用,去访问子类和父类中存在相同名字的变量或方法(不构成重载),同样优先访问子类,子类中不存在才去访问父类,都没有则编译报错。

3)那如果子类和父类中存在相同的名字和方法,该如何访问到父类中的呢?下面介绍一个关键字:super

5.使用super关键字访问父类

这个super关键字和this有三个类似的功能,而super出现的意义就是:在子类的方法中访问父类

(1)super访问父类成员变量

这种一定是要求在子类这个类中,而且是在子类中一个方法内

访问:

结果:前面两个为子类,后面一个为父类

(2)访问父类成员方法

三种访问方式:

结果:

(3)super和this的大致访问

(4)super访问父类构造方法

下面先介绍父类构造方法

6.父类构造方法

在构造方法这里,和前面类的构造方法很类似。不写构造方法时,编译器默认提供,写了不带参数没有实现的构造方法也默认没有提供,但是如果写了带参数的构造方法,编译器则不会再提供

(1)不提供构造方法

第一种情况:正常

第二种情况:正常

第三种情况:

(2)主动提供构造方法

第一种情况:只给子类提供

第二种情况:只给父类提供(报错)

原因解释:当父类提供了构造方法之后,子类就不会再提高任何的构造方法;因为父类需要初始化,但是子类中没有构造方法,无法调用父类的构造方法,所以会报错

做法:在子类中也提供构造方法,并在里面使用super关键字调用父类构造方法

第三种情况:子类父类都提供

根据上面的情况,我们可以做出一些总结

(3)关于构造方法的总结

1)父子类,每次构造子类对象前,都会先完成对父类的构造。也就是说,总是会先调用父类的构造方法,再调用子类的构造方法

2)程序员不提供任何构造方法,编译器都会默认提供

3)当父类手动提供了构造方法,而子类却没有,则会报错,因为子类无构造方法则无法调用

4)针对上面第三点的解释:为什么子类和父类都不提供构造方法时,可以调用到父类构造?

即使是默认的构造方法,在子类构造中,也都会默认有一个super()语句,无论写没写。

当父类手动提供了带参构造方法之后,子类中也就不会再提供任何的构造方法;同理,子类中手动提供了带参构造方法,父类中也不会再提供但是,前者会报错,因为构造子类前,一定会先去构造父类(但是没有super(),无法调用父类构造);而后者,父类不存在带参构造方法,不需要强制初始化。(存在带参构造方法时,在实例化一定要对其赋值,否则就是报错,上面的终究原因)

(4)使用super()调用父类构造方法

1)默认提供(不细说了)

2)手动提供

class Big {public int a;public Big(int a) {this.a = a;}
}
class Min extends Big {public int b;public Min(int a, int b) {super(a);this.b = b;}
}
public class Test3 {public static void main(String[] args) {Min min = new Min(10,20);}
}

(5)关于super的细节和注意事项

1)super()必须在子类构造方法中的第一行,否则报错

并且,super()只能出现一次,也不能和this()同时出现(他们都必须在第一行)

2)只能存在于非静态的方法中,依赖对象;用来访问非静态成员方法和字段

7.介绍protected

这是一个关键字,一般是用于修饰成员变量和成员方法

根据上表可知,只要在同一个包中,不同类之间是可以互相使用的;它还多了一条性质,就是只要是父子类关系,在不同的类中也可以互相调用。

下面是不同包中的两个类 

(1)不能访问的状态

1)public修饰

2)被protected修饰后

意思就是:在不同包中,不能直接访问被protected修饰的成员变量

(2)允许访问状态

想要访问被protected修饰的成员变量,就要按照下面的步骤来进行

1)使用继承关系

2)使用super关键字访问父类

错误原因就是super不能在静态方法中使用

3)正确访问

访问并且赋值:

8.final关键字

final关键字在java中有三个功能。

(1)修饰变量(2)修饰类(3)修饰方法

(1)修饰变量

1)未修饰时:

public static void main(String[] args) {int a = 520;System.out.println(a);a = 250;System.out.println(a);}

未被修饰时,变量的值是可以被改变的;也就是说,没有被final修饰的520就是250

2)加上修饰

语法:

final 类型 变量名字 = 值;

被fianl修饰的变量,可以理解成变成了一个常量,此时是无法被修改的。

(2)final修饰类

作用:被final修饰的类,不能再被继承,称为密封类

1)修饰前:

2)修饰后:

(3)修饰方法

作用:当这个方法被修饰后,表明这个方法不能再被重写

1)未被修饰

2)被修饰后

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

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

相关文章

【位运算】【 数学】【 哈希映射】2857. 统计距离为 k 的点对

本文涉及知识点 位运算 数学 哈希映射 LeetCode 2857. 统计距离为 k 的点对 给你一个 二维 整数数组 coordinates 和一个整数 k ,其中 coordinates[i] [xi, yi] 是第 i 个点在二维平面里的坐标。 我们定义两个点 (x1, y1) 和 (x2, y2) 的 距离 为 (x1 XOR x2) …

STM32最小核心板使用HAL库实现UART接口通讯(中断方式)

正式环境里需要串联电阻,或设计过滤电路。核心板是STM32F103C8T6 这里使用了UART3的接口,具体使用MX创建项目就不放了,百度下都有 /*USART3 GPIO ConfigurationPB10 ------> USART3_TXPB11 ------> USART3_RX */ 因为是串口…

开发技术-FeignClient 对单个接口设置超时时间

1. 背景 FeignClient 调用某个接口,3s 没有结果就需要停止,处理后续业务。 2. 方法 FeignClient 自定义 name 属性 FeignClient(name "aaa" , url "xxx") public interface TestApi {ResponseBodyPOSTMapping(value "xx…

以码会友|PR大征集!2024共绘 MoonBit 新篇章!

首先,感谢 MoonBit 社区所有的贡献者在过去一个月积极的参与和贡献!为了感谢与鼓励更多的MoonBit Contributor,我们以码会友,邀请你加入“一起成为MoonBit Contributor!” 的活动! 活动内容也可以点击文章…

【第十三章】改进神经网络学习方式-其他正则化技术

L1正则化 除了L2正则化之外,还有许多正则化技术。事实上,已经开发出了如此多的技术,以至于我不可能总结它们。在本节中,我简要介绍了三种减少过拟合的其他方法:L1正则化、dropout和人为增加训练集大小。我们不会像之前…

在ComfyUI中,IP-Adapter的一大堆模型应该怎么放?

🎁背景介绍 IP-Adapter有一大堆的模型,那么这个模型在ComfyUI中,这些模型到底应该怎么放呢?这篇文章简单介绍一下。 首先,大家需要到huggingface上找到对应的模型,把所有的模型先下载下来。 huggingface…

技术工作报告-基于linux的信息转二维码图像方法的研究

一、摘要: 本报告旨在介绍基于Linux的信息转二维码图像方法的研究。通过对二维码技术的背景和相关研究的调研,我们提出了一种基于Linux平台的信息转二维码图像方法,并进行了实验验证。本方法可以在Linux系统上实现高效、准确的信息转二维码图…

数据分析的具体流程

1.导入 表格导入数据时要注意数据的格式问题非表格导入 可以先将文档放入word中 将换行符(^p)替换为|||,选择特殊格式中的段落标记 进行全部替换 以每一列最后的数据/平,作为换行的标志 将所整理的信息导入excel,对数据进行分列 选…

大数据 - Spark系列《十四》- spark集群部署模式

Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

Git版本管理工具

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: Git使用教程-配置管理 git reset详解-CSDN博客 3、Git使用不完全指南&am…

二维数组应用案例

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 考试成绩统计 案例描述:有三名同学(张三、李四、王五),在一次考试中成绩分别如下表,请分别输出三名同学的总成绩。 成绩表 语…

全面整理!机器学习常用的回归预测模型(表格数据)

文章目录 一、前言二、线性模型三、非线性模型 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 回归预测建模的核心是学习输入 X X X 到输出 y y y (其中 y y y 是连续值向量)的映射关系。条件期望 E ( Y ∣ X x…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念,为了更好地服务于客户…

c/c++ 深拷贝和浅拷贝

深拷贝与浅拷贝 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制的两种不同方式,它们涉及到对象成员数据的复制方式和内存管理。 浅拷贝(Shallow Copy): 浅拷贝是指将一个对象的…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω\)(///) C:继承:面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

算法笔记p251队列循环队列

目录 队列循环队列循环队列的定义初始化判空判满入队出队获取队列内元素的个数取队首元素取队尾元素 队列 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。队列的常用操作包括获取队列内元素的个数&a…

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用,内容包括了: RGB、RGBA,HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

Jmeter接口测试步骤

一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试,在用posman测试时候会发现的是一个接口一个接口的测试,我们每次测试成功后的数据,在工具中是无法保存的,再次测试的时…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 (1)蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型,蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声…

Vue.js开发基础

单文件组件 使用Vite创建Vue项目后,目录结构中包含一些扩展名为.vue的文件,每个.vue文件都可用来定义一个单文件组件。Vue中的单文件组件是Vue组件的文件格式。每个单文件组件由模板、样式和逻辑3个部分构成。 运行结果: 1.模板 模板用于搭建…