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

news2024/11/13 16:19:08

在这里插入图片描述

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,则优先访问子类的a
   b=2;//父类和子类都有b,则优先访问子类的b
   c=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.coloradmin.cn/o/2092503.html

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

相关文章

<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

【C++ Primer Plus习题】7.10

问题: 解答: #include <iostream> using namespace std;double add(double a, double b) {return a b; }double mul(double a, double b) {return a * b; }double sub(double a, double b) {return a - b; }double div(double a, double b) {return a / b; }double cal…

[LLM]:大模型(Transformer)参数量分析

1. 前言2. 模型参数量 文章内容主要摘自&#xff1a;https://zhuanlan.zhihu.com/p/624740065 1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&am…

Python编码系列—Python代码重构:提升代码质量

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Leetcode面试经典150题-151.反转字符串中的单词

class Solution {public String reverseWords(String s) {/**先trim一下去掉前后的空格*/String str s.trim();/**转成字符数组 */char[] sArr str.toCharArray();/**先整体倒置*/int l 0;int r sArr.length - 1;reverse(sArr, l, r);/**然后每个单词中逆序 */int left 0;…

SAM 提示框和 Unet的语义分割的融合:自动驾驶车道线分割

1、前言 最近SAM 模型复现的多了&#xff0c;看了不少官方的源码&#xff0c;尝试下SAM和Unet的结合 SAM的提示分割&#xff0c;其实就是在分割的时候&#xff0c;为数据增加一个提示信息&#xff0c;可以是框&#xff0c;点&#xff0c;或者文本等等。这样大模型网络就可以根…

【Python】简单的爬虫抓取

效果&#xff1a;抓取某个学校网站的教授名录&#xff0c;并获取研究方向。 由于网站使用的都是明文&#xff0c;所以抓起来没什么难度&#xff0c;且平时访问量小&#xff0c;很值得用来练习。 代码如下&#xff0c;解释请见注释 import timeimport requests from bs4 impor…

RN开发问题

1、滚动项定位错误 ERROR Invariant Violation: scrollToIndex should be used in conjunction with getItemLayout or onScrollToIndexFailed, otherwise there is no way to know the location of offscreen indices or handle failures. 原因&#xff1a;已修复&#xff0c…

求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (一) 依赖库编译、第三方库编译安装

目录 1 jetson-ffmpeg的编译安装与配置--用来做视频编码、视频解码 2 CV-CUDA库的编译安装与配置--用来做图像缩放、裁剪、色域转换 3 cuda cudnn TensorRT相关库的拷贝与配置 3.1将cuda cudnn TensorRT相关的头文件拷贝到工程中 3.2 将cuda cudnn TensorRT相关的库拷贝到…

docker实战基础一

一、docker安装 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 Doc…

FlowUs:强大图表功能与多维表结合,开启便捷办公新时代

在当今数字化办公的浪潮中&#xff0c;我们一直在寻找一款能够高效整合数据、清晰呈现信息的工具。而 FlowUs 以其强大的图表功能结合多维表的能力&#xff0c;为我们带来了前所未有的便捷体验。 一、多维表&#xff1a;数据管理的强大基石 FlowUs 的多维表功能就像是一个数据魔…

016_Save_the_picture_in_Matlab中保存图片

图片文件 Matlab核心功能包括出图&#xff0c;印刷质量的图片输出是Matlab核心竞争力之一&#xff0c;matplotlib疯狂追赶&#xff0c;但还是差距明显。出图的含义就是&#xff1a;打印或者导出图形窗体的内容&#xff0c;可供后续使用。在Matlab中&#xff0c;这个行为被定义…

弗洛伊德(Floyd)算法(C/C++)

弗洛伊德算法&#xff08;Floyds algorithm&#xff09;&#xff0c;又称为弗洛伊德-沃尔什算法&#xff08;Floyd-Warshall algorithm&#xff09;&#xff0c;是一种用于在加权图中找到所有顶点对之间最短路径的算法。这个算法适用于有向图和无向图&#xff0c;并且可以处理负…

[YM]课设-C#-WebApi-Vue-员工管理系统 (五)登录

分析&#xff1a; 请求路径&#xff1a;/login 请求方式&#xff1a;POST 接口描述&#xff1a;该接口用于员工登录Tlias智能学习辅助系统&#xff0c;登录完毕后&#xff0c;系统下发JWT令牌。 > api文档中提到JWT令牌 这个相对来说比较复杂 是用来加密&#xff0c;…

那些生意好的厂家如何找到目标客户呢?

寻找并精准定位目标客户是任何一家追求持续发展与业务增长的厂家必须掌握的关键技能。那些生意兴隆的厂家之所以能够脱颖而出&#xff0c;很大程度上得益于他们高效且精准的客户寻找策略。今天&#xff0c;我们将深入探讨这些成功厂家如何精准找到并吸引目标客户。 01明确目标…

基于梯度提升系列算法对二手车价格预测分析与研究

目录 1 引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 1.3 国内外现状 1.4 研究思路与组织框架 2 关键技术理论介绍 2.1 二手车市场介绍 2.2 梯度提升回归系列算法介绍 3 数据来源及预处理 3.1 数据来源及说明 3.2 数据预处理及特征变换 第4章 数据分析及可视化 4.1 分析思路及…

自闭症孩子的康复治疗方法

在星贝育园&#xff0c;我们深知自闭症给孩子和家庭带来的巨大挑战。作为特教老师和生活老师&#xff0c;我们秉持着专业、负责的态度&#xff0c;为自闭症患儿提供全方位的康复治疗。 我们实行 24 小时陪伴&#xff0c;365 天全年无休的密集干预模式。这种模式能够确保孩子在任…

[Leetcode 216][Medium]组合总和 III--回溯

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 对于组合问题&#xff0c;首先要想到回溯法。那么可以根据回溯法模版进行设计。 void backtrace(元素){if(满足题目要求的条件){保存目前路径/状态/结果;return;}for循环,往目前状态相邻的所…

100天带你精通Python——第8天面向对象编程

文章目录 前言面向对象技术简介类&#xff08;Class&#xff09;对象&#xff08;Object&#xff09;继承&#xff08;Inheritance&#xff09;封装&#xff08;Encapsulation&#xff09;多态&#xff08;Polymorphism&#xff09;Python类详解静态变量&#xff08;Static Var…