穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

在这里插入图片描述

1.为什么要继承

2.什么是继承以及继承的方式

3.继承的一些语法

4.父类成员的访问
5.关键字super
6.关键字protected
7.关键字final
8.继承与组合

一:为什么要继承

①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重新编写相同的代码。这有助于减少代码冗余,提高代码的可维护性和可扩展性。
②实现多态:多态是面向对象编程的三大特性之一(封装、继承、多态)。通过继承,我们可以定义具有共同接口(即方法)的多个类,这些类可以执行不同的操作。这增加了程序的灵活性和复用性。
③实现框架和库:在开发大型应用程序时,通常会使用框架和库来提供基础功能。这些框架和库通过继承机制,允许开发者定义自己的类来扩展或定制现有功能。
④表达类之间的“是一种”关系:继承可以用来表达类之间的“是一种”(is-a)关系。例如,如果有一个Animal类,我们可以创建一个Dog类继承自Animal类,因为狗是一种动物。这种关系使得类的设计更加直观和易于理解。
⑤提供模板和抽象基类:通过继承,我们可以创建模板类(也称为抽象基类或接口类),这些类只定义接口(即方法签名),而不实现它们。这样,子类就必须实现这些接口,从而强制实现特定的行为。这有助于确保子类遵循一致的编程范式。
⑥促进模块化:继承有助于将程序分解成更小的、可管理的部分(即类)。每个类负责特定的功能,并通过继承与其他类交互。这有助于促进程序的模块化和封装性。

二:什么是继承以及继承的方式

继承是面向对象编程(OOP)中的一个核心概念,它提供了一种机制,允许我们基于已有的类来创建新的类,新创建的类被称为子类(或派生类),而原有的类被称为父类(或基类、超类)。
这里是引用

Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的
子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。
从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态。
继承又分单继承、多层继承、不同类继承同一个类。

单继承:

在这里插入图片描述

public class A{
·······
}
public class B extends A{
·······
}

多层继承:

在这里插入图片描述

public class A{
·······
}
public class B extends A{
·······
}
public class C extends B{
·······
}

不同类继承同一个类:

在这里插入图片描述

public class A{
·······
}
public class B extends A{
·······
}
public class C extends A{
·······
}

注意不支持如图所示的多继承

public class A{
·······
}
public class B {
·······
}
public class C extends B/A{
·······
}
**//java不支持多继承**

三:继承的一些语法

class 基类名 {  // 基类的成员变量和成员函数  
}  class 派生类名 extends 基类名 {  // 派生类的成员变量和成员函数  
}

四:父类成员的访问
1、子类与父类不存在同名的成员变量

public class w{int a;int b;
}
public class m extends w{int c;
public void method(){a=1;//父类继承下来的b=2;//父类继承下来的c=3;//子类自己的}
} 

2、子类和父类成员变量同名

public class w{int a;int b;
}
public class m extends w{int a;int b;int c;
public void method(){a=1;//父类和子类都有a,则优先访问子类的ab=2;//父类和子类都有b,则优先访问子类的bc=3;//只有子类有,访问子类的}
} 

成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

3、子类中访问父类的成员方法名字不同

public class w {public void methodA(){System.out.println("w中的methodA()");}
}
public class m extends w{public class methodB(){System.out.println("w中的methodB()");}public class methodC(){methodB(); // 访问子类自己的methodB()methodA(); // 访问父类继承的methodA()// methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()}}

四、子类中访问父类的成员方法名字相同

public class w{public void methodA(){System.out.println("w中的methodA()");}public void methodB(){System.out.println("w中的methodB()");}
}
public class m extends w{public void methodA(int a) {System.out.println("m中的method(int)方法");}public void methodB(){System.out.println("m中的methodB()方法");}public void methodC(){methodA(); // 没有传参,访问父类中的methodA()methodA(100); // 传递int参数,访问子类中的methodA(int)methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到}
}

五:关键字super

如果子类中存在与父类中相同的成员时,这是super就起到了作用。

public class w {int a;int b;public void methodA(){System.out.println("w中的methodA()");
}public void methodB(){System.out.println("w中的methodB()");}
}
public class m extends w{int a; // 与父类中成员变量同名且类型相同char b; // 与父类中成员变量同名但类型不同// 与父类中methodA()构成重载public void methodA(int a) {System.out.println("m中的method()方法");
}// 与基类中methodB()构成重写(即原型一致,重写后序详细介绍)public void methodB(){System.out.println("m中的methodB()方法");}public void methodC(){// 对于同名的成员变量,直接访问时,访问的都是子类的a = 100; // 等价于: this.a = 100;b = 101; // 等价于: this.b = 101;// 注意:this是当前对象的引用// 访问父类的成员变量时,需要借助super关键字// super是获取到子类对象中从基类继承下来的部分super.a = 200;super.b = 201;// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法methodA(); // 没有传参,访问父类中的methodA()methodA(20); // 传递int参数,访问子类中的methodA(int)// 如果在子类中要访问重写的基类方法,则需要借助super关键字methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到super.methodB(); // 访问基类的methodB()}
}

六:关键字protected
protected用于修饰类的成员(包括成员变量、成员方法和构造方法),它提供了一种比默认访问权限(包访问权限)更严格的访问控制,但又比private访问权限更宽松。
七:关键字final
修饰变量:final修饰的变量一旦初始化后,其值就不能被改变。这通常用于定义常量。
修饰方法:final修饰的方法不能被子类覆盖(重写)。这有助于防止子类意外地改变父类的行为。
修饰类:final修饰的类不能被继承。这通常用于设计那些不需要被扩展的类,如String、Integer等。
final关键字在Java中的好处包括确保数据完整性、提高代码安全性以及增强性能。因为final变量和方法在编译时就可以确定其不变性,所以编译器可以对它们进行优化。
八:继承与组合
例如一辆汽车
在这里插入图片描述
汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合

// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// 车载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire; // 可以复用轮胎中的属性和方法
private Engine engine; // 可以复用发动机中的属性和方法
private VehicleSystem vs; // 可以复用车载系统中的属性和方法
// ...
}
// 奔驰是汽车
class Benz extend Car{
// 将汽车中包含的:轮胎、发送机、车载系统全部继承下来
}

注意:
1.继承是一种“is-a”关系,即派生类是基类的一个特殊化版本。
2.继承不是万能的,过度使用继承会导致代码结构复杂、难以维护。在设计类时,应优先考虑组合(composition)而不是继承(inheritance)。
3.在使用继承时,要注意成员变量的隐藏和方法的重写,以避免出现意外的行为。

在这里插入图片描述

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

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

相关文章

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题 问题描述:在服务器上,我配置了一个虚拟环境,明确指定使用 Python 3.8 版本。然而,当我激活该环境并检查 Python 版本时,意外地发现…

Golang中的timer和ticker

Golang中的timer和ticker Timer func AppTimer() {// st : time.Now()// // 创建timer&#xff0c;定时2s// timer : time.NewTimer(2 * time.Second)// timer.Stop()// //<-timer.C// timer.Reset(3 * time.Second)// <-timer.C// fmt.Println(time.Since(st))// Afte…

21. Map接口中keySet()、values()和entrySet()方法的区别是什么?它们各自返回什么内容?

在Java中&#xff0c;Map接口提供了keySet()、values()和entrySet()方法&#xff0c;这些方法用于访问Map中的不同部分。下面详细介绍它们的区别以及它们各自返回的内容。 1. keySet() 方法 作用: keySet()方法返回Map中所有键&#xff08;Key&#xff09;的集合。 返回类型: …

OSI七层模型中的数据链路层

图片&#xff1a;数据帧的格式 这里面的一个关键点是&#xff0c;数据的源IP和目标IP在哪里&#xff1f; 就在图中的“数据”里面&#xff0c;这个“数据”也就是网络层的数据包&#xff0c;如果是TCP类型的数据包&#xff0c;数据包里面就包含TCP类型的首部信息&#xff0c;…

实测数据处理(RD算法处理)——SAR成像算法系列(十)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《距离多普勒算法&#xff08;RDA&#xff09;-SAR成像算法系列&#xff08;三&#xff09;》 文章目录 一、算法流程 1.1、回波信号生成 1.2、 距离脉冲压缩 1.3、距离徙动校正 1.4、方位脉冲压缩 …

midwayjs 框架使用 rabbitmq 消息延迟

插件rabbitmq_delayed_message_exchange是RabbitMQ官方提供的一种用于实现延迟消息的解决方案。该插件将交换机类型扩展至x-delayed-message&#xff0c;这种类型的交换机能够将消息暂时挂起&#xff0c;直到设定的延迟时间到达&#xff0c;才将消息投递到绑定的队列中。这一特…

代理 IP 在工业物联网中的大作用

随着科技的飞速发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为现代工业的重要组成部分&#xff0c;它通过将各种物理设备、传感器、控制系统等通过互联网连接起来&#xff0c;实现了工业生产的智能化、自动化和远程监控。而在这个庞大的网络体系中&#xff0…

掌握CHECK约束:确保数据准确性的关键技巧

掌握CHECK约束&#xff1a;确保数据准确性的关键技巧 在数据库设计和管理中&#xff0c;数据的准确性和完整性至关重要。CHECK约束是SQL中一种强大的工具&#xff0c;用于限制列中的数据值&#xff0c;确保它们满足特定的条件。本文将详细介绍如何使用CHECK约束&#xff0c;并…

湖南师范大学教育科学学报

期刊名称&#xff1a; 湖南师范大学教育科学学报 国内统一刊号(CN)&#xff1a; 42-94 国际标准刊号(ISSN)&#xff1a;BM1712 刊物设有两大特色专题“古典教育”和“教科书研究”&#xff0c;常设“教育基本理论研究”、“教育哲学研究”、“教师教育研究”、“高等教育研究”…

Nginx跨域问题解决

背景&#xff1a;云服务器上面部署了后端和前端&#xff0c;前端开发在本地启一个web访问页面&#xff0c;然后访问云服务的后端&#xff0c;然后出现问题 问题&#xff1a;Access to XMLHttpRequest at ‘http://192.168.10.100:8070/auth/login’ from origin ‘http://loca…

[E二叉树] lc104. 二叉树的最大深度(dfs+自顶向下)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;104. 二叉树的最大深度 题单&#xff1a; 链表、二叉树与一般树&#xff08;前后指针/快慢指针/DFS/BFS/直径/LCA&#xff09; 2.2 自顶向下 DFS 2. 题目解析 思路&#xff1a; 很基础的 dfs 题目哈&#x…

k8s单master多node环境搭建-k8s版本低于1.24,容器运行时为docker

k8s 1.20.6单master多node环境搭建 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置三台主机之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&#xf…

github源码指引:C++嵌入式WEB服务器

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 相关专题&#xff1a; C嵌入式…

基于Spring Boot的文字识别系统

前端使用htmlcssjs&#xff0c;后端使用Spring Boot&#xff0c;数据库使用mysql&#xff0c;识别算法有两个&#xff0c;一个是使用百度OCR接口&#xff0c;一个是自己写一个python&#xff0c;用flask包装。 其中百度OCR接口可以去免费申请&#xff0c;然后把appid、apikey、…

Netty 知识目录

Netty 知识结构Netty Bootstrap/ServerBootstrapNetty EventLoopGroup/EventLoopNetty ChannelNetty ChannelPipeline/ChannelHandlerNetty ByteBufNetty TCPNetty UDPNetty HTTPNetty WebsocketNetty SSL/TLS

【王树森】Transformer模型(1/2): 剥离RNN,保留Attention(个人向笔记)

Transformer简介 Transformer 是一个Seq2Seq模型Tramsformer 不是RNNTransfomer 只有attention和全连接层机器翻译在大型数据集上完爆最好的RNN Review Attention for RNN 这节课讲的attention相对比于前两节课多了一个 v i v_i vi​&#xff0c;之前是用权重直接乘 h h h&…

【GD32】从零开始学GD32单片机 | USB通用串行总线接口+HID键盘例程(GD32F470ZGT6)

1. 简介 USB&#xff0c;全称通用串行总线&#xff0c;相信大家都非常熟悉了&#xff0c;日常生活只要用到手机电脑都离不开这个接口&#xff0c;像鼠标键盘U盘都需要使用这个接口进行数据传输&#xff0c;下面简单介绍一下。 1.1 版本标准 USB的标准总体可以分为低速、全速和…

业务资源管理模式语言02

图1 模式间的依赖关系 第一节&#xff1a;最开始&#xff0c;关注应用中包括的资源。首先&#xff0c;必须标识资源&#xff08;1&#xff09;&#xff0c;下一步&#xff0c;检查资源限定&#xff08;2&#xff09;&#xff0c;同时量化资源&#xff08;3&#xff09; 模式1…

c#笔记5 详解事件的内置类型EventHandler、windows事件在winform中的运用

为什么要研究这一问题&#xff1f; 事件和委托可以说是息息相关。 前面先解释了什么是委托&#xff0c;怎么定义一个委托以及怎么使用匿名方法来内联地新建委托。 事实上事件这一机制在c#的程序开发中展很重要的地位&#xff0c;尤其是接触了winform软件开发的同学们应该都知…

Unity 动态光照贴图,加载后显示变暗或者变白问题 ReflectionProbe的使用

动态加载光照贴图代码&#xff0c;可参考这个帖子 Unity 预制动态绑定光照贴图遇到变白问题_unity urp 动态加载光照信息 变黑-CSDN博客 这次遇到的问题是&#xff0c;在编辑器下光照贴图能正常显示&#xff0c;打出apk后光照贴图加载后变黑的问题 以下4张图代表4种状态&…