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

Java中的继承

引入继承

Java中使用类对实体进行描述,类经过实例化之后的产物对象,就可以用来表示现实中的实体,描述的事物错综复杂,事物之间可能会存在一些关联,因此我们就需要将他们共性抽取,面向对象的思想中提出了继承的概念,专门用来共性抽取,实现代码复用。

继承的概念

继承--inheritance: 它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生的新的类,我们叫做派生类。

继承最重要的思想就是:共性的抽取,代码的复用

继承的语法

修饰符 class 子类 extends 父类{
...
}

dog类和cat类都继承了Animal类,其中:Animal类称为父类/基类或者超类,dog和cat称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类只需要在实现时关心自己新加的成员即可。

//Animal.java
public class Animal {String name;int age;public void eat(){System.out.println(name+"在吃饭");}public void sleep(){System.out.println(name+"在睡觉");}}//Dog.java
public class Dog extends Animal{void bark(){System.out.println(name+"在叫");}}//Cat.java
public class Cat extends Animal{void mew(){System.out.println(name+"在叫");}
}//TestExtend.java
public class TestExtend {public static void main(String[] args) {Dog dog = new Dog();//Dog类中没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的System.out.println(dog.name);System.out.println(dog.age);//dog访问eat()和sleep()也是从Animal中继承下来的dog.eat();dog.bark();dog.sleep();}
}

 由于我没有放名字,执行结果也就是

总的来说就是两个方面

1.子类会将父类中的成员变量或者成员方法继承到子类中

2.子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没必要继承了

有时具体代码怎么实现,子类能否直接访问父类继承下来的呢?

子类中访问父类的成员变量

①.子类和父类不存在同名成员变量

public class Base {int a;int b;
}class Derived extends Base{int c;public void method(){a = 10;//访问从父类继承下来的ab = 20;//访问从父类继承下来的bc = 30;//访问子类自己的c}
}
  1. Base

    • Base 类定义了两个成员变量 a 和 b,它们是 int 类型。由于没有使用 private 进行修饰,它们是默认的包访问权限(default),可以在同一包内的其他类中访问。
  2. Derived

    • Derived 类继承了 Base 类,所以它自动拥有 Base 类的成员变量 a 和 b。同时,Derived 类还声明了一个额外的成员变量 c,类型为 int
  3. method() 方法

    • 这是 Derived 类中的一个方法,方法内部访问了父类 Base 的成员变量 a 和 b,以及子类 Derived 自己的成员变量 c
      • a = 10;:通过继承,Derived 类可以访问并修改 Base 类的 a 变量。
      • b = 20;:同样,Derived 类可以访问并修改 Base 类的 b 变量。
      • c = 30;:这是对子类 Derived 的成员变量 c 赋值。

②.子类和父类成员变量同名

public class Base {int a;int b;int c;
}class Derived extends Base{int a; //与父类中成员a同名,且类型相同char b;//与父类中成员b同名,但类型不同public void method(){a = 100;b = 200;c = 300;}
}

在Derived 类中

  • Derived 类继承自 Base 类,因此 Derived 类会自动继承 Base 类中的 ab 和 c 成员变量。但在 Derived 类中:
    • int a;:声明了一个与父类同名的成员变量 a,但它是在子类中重新定义的。这并不是覆盖父类的 a,而是隐藏了父类的 a,也就是说,子类 Derived 会有一个自己的 a,与父类的 a 不同。
    • char b;:声明了一个与父类同名但类型不同的成员变量 b,父类的 b 是 int 类型,子类的 b 是 char 类型。这也导致了父类的 b 被子类的 b 隐藏,但类型不兼容。
  • method() 方法:
    • a = 100;:这里的 a 是指 Derived 类中的 a(子类的成员变量),所以赋值给子类中的 a
    • b = 200;:这里的 b 是指 Derived 类中的 b(子类的成员变量),因此赋值给子类的 b。由于 b 的类型在父类和子类中不同(父类是 int,子类是 char),这在实际编译时会出现类型不匹配错误。

就是说

  1. a 是一个 int 类型的变量,在父类和子类中都存在,但是它们分别是独立的。
  2. b 是一个 int 类型的变量在父类中,而在子类中是 char 类型的,类型不同会导致赋值时出现问题。
  3. c 在子类中直接访问父类的 c,这是合法的,因为 c 是从父类继承过来的。

所以,我们就会发现

成员变量访问遵循的是一种就近原则,自己子类有优先自己的,如果没有就向父类去找


子类中访问父类的成员方法

还是一样的讨论

  • 名字相同
  • 名字不同

成员方法名字不同

public class Base {public void methodA(){System.out.println("Base中的methodA()");}
}
class Derived extends Base{public void methodB() {System.out.println("Derived中的methodB()");}public void methodC(){methodB();//访问子类自己的methodBmethodA();//访问父类继承的methodA}
}

一样的,还是优先就近的

成员方法名字相同

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

【说明】

  • 通过子类对象访问父类与子类中不同方法时,优先在子类中找,找到则访问,否则在父类中去找。找到则访问,否则编译报错
  • 通过子类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数不同(也就是方法重载了),根据调用方法传递参数选择合适方法去访问,如果没有也报错

但是我们可以看到父类的methodB是访问不到的,如果我们要直接去访问,是做不到的,该如何操作呢???

super关键字

在子类方法中访问父类成员<可以理解为是一种引用,只能指代直接的父类,不能指父类的父类>

public class Base {int a;int b;public void methodA(){System.out.println("Base中的methodA()");}public void methodB(){System.out.println("Base中的methodB()");}
}
class Derived extends Base {int a;  //与父类中成员变量同名且类型相同char b; //与父类中成员变量同名但类型不同public void methodA(int a) {System.out.println("Derived中的methodA(int)");}public void methodB() {System.out.println("Derived中的methodB()");}public void methodC() {a = 100;  //等价于this.a = 100b = 101;  //等价于this.b = 101   this是当前对象的引用//访问父类的成员变量时,需要借助super//super是获取到子类对象中从父类继承下来的部分super.a = 200;super.b = 201;//父类和子类中构成重载的方法,直接通过参数列表区分清楚访问父类还是子类methodA();methodA(20);//如果在子类中要访问重写的父类方法,用到supermethodB();super.methodB();}
}

super、this都不能在静态方法中使用

相关文章:

Java中的继承

引入继承 Java中使用类对实体进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;就可以用来表示现实中的实体&#xff0c;描述的事物错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;因此我们就需要将他们共性抽取&#xff0c;面向对象的思想中提出了继…...

Cadence笔记--原理图导入PCB

1、以PMU6050为例&#xff0c;首先在原理图双击PMU6050器件&#xff0c;在PCB_Footprint目录填写PCB封装名称并且保存&#xff0c;如下图所示&#xff1a; 2、确保原理图命名的名称不一样&#xff0c;否则会出错&#xff0c;这里PMU6050更改了NC等名称&#xff0c;如下图所示&a…...

从AI生成内容到虚拟现实:娱乐体验的新边界

引言 在快速发展的科技时代&#xff0c;娱乐行业正经历一场前所未有的变革。传统的娱乐方式正与先进技术融合&#xff0c;创造出全新的沉浸式体验。从AI生成的个性化内容&#xff0c;到虚拟现实带来的身临其境的互动场景&#xff0c;科技不仅改变了我们消费娱乐的方式&#xf…...

【Linux】gdb_进程概念

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

安全类脚本:拒绝ssh暴力破解

要求如下&#xff1a; 一个小时内&#xff0c;连续密码错误4次。 Linux lastb 命令用于列出登入系统失败的用户相关信息。 实验过程如下&#xff1a; 1. 创建两个IP地址不同的干净环境&#xff0c;分别是&#xff1a;192.168.46.101 Rocky 2 和 192.168.46.120 openEuler 2. 2.…...

Android15源码编译问题处理

最近想在Raspberry Pi5上面运行自己编译的Android15镜像,参考如下链接来处理: GitHub - raspberry-vanilla/android_local_manifest GitHub - raspberry-vanilla/android_kernel_manifest 代码同步完后,编译就出问题了,总是提示: FAILED: analyzing Android.bp files and…...

图解Git——分布式Git《Pro Git》

分布式工作流程 Centralized Workflow&#xff08;集中式工作流&#xff09; 所有开发者都与同一个中央仓库同步代码&#xff0c;每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件&#xff0c;后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…...

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…...

什么是数据仓库?

什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW&#xff09;是一种面向分析和决策的数据存储系统&#xff0c;它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储&#xff0c;为数据分析、报表生成以及商业智能&#xff08;…...

计算机网络 (48)P2P应用

前言 计算机网络中的P2P&#xff08;Peer to Peer&#xff0c;点对点&#xff09;应用是一种去中心化的网络通信模式&#xff0c;它允许设备&#xff08;或节点&#xff09;直接连接并共享资源&#xff0c;而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…...

SK海力士(SK Hynix)是全球领先的半导体制造商之一,其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。

SK海力士&#xff08;SK Hynix&#xff09;是全球领先的半导体制造商之一&#xff0c;其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。以下是SK海力士的一些主要产品型号和类别&#xff1a; DRAM 产品 DDR4 DRAM 特点: 高速、低功耗&#xff0c;广泛应用于PC、服务器和移…...

FunASR 在Linux/Unix 平台编译

第一步拉取镜像并生成容器&#xff1a; ### 镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; shell sudo docker pull \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.12 mkdir -p ./funasr-runtime-…...

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…...

物联网网关Web服务器--Boa服务器移植与测试

1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器&#xff0c;是一个运行于unix或linux下的&#xff0c;支持CGI的、适合于嵌入式系统的单任务的http服务器&#xff0c;源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…...

vue3学习日记8 - 一级分类

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...

前端实习第二个月小结

时间飞快&#xff0c;第一次实习已经过去两个多月&#xff0c;作一些简单的总结和分享。 注&#xff1a;文章整体会比较轻松&#xff0c;提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务&#xff0c;技术栈&#xff1a;前端re…...

深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术

深入了解卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像处理与深度学习的革命性技术 导语 卷积神经网络&#xff08;CNN&#xff09;是现代深度学习领域中最重要的模型之一&#xff0c;特别在计算机视觉&#xff08;CV&#xff09;领域具有革命性的影响。无论是图…...

b站视频(网页加客户端)+本地视频 生成回链

b站视频(网页加客户端)本地视频 生成回链 引言 基于上一篇博客方案 本地视频进度加入笔记根据进度快速锁定视频位置 我想着只有本地的话, 那b站上的视频, 不是每次都得下载下来吗? 如果是一套课程, 直接下载, 然后视频处理成mp3,还好, 如果只是一个视频, 每次这样处理就有点…...

3.数据库系统

3.1数据库的基本概念 3.1.1:数据库体系结构 3.1.1.1集中式数据库系统 数据是集中的 数据管理是集中的 数据库系统的素有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机 3.1.1.2C/S结构 客户端负责数据表示服务服务器主要负责数据库服务 数据库系统分为前端和后端…...

红米k40s设备驱动设备驱动树

github地址# 链接https://github.com/autoandroida/vendor_xiaomi_munch...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...