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}
}
-
Base类:Base类定义了两个成员变量a和b,它们是int类型。由于没有使用private进行修饰,它们是默认的包访问权限(default),可以在同一包内的其他类中访问。
-
Derived类:Derived类继承了Base类,所以它自动拥有Base类的成员变量a和b。同时,Derived类还声明了一个额外的成员变量c,类型为int。
-
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类中的a、b和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),这在实际编译时会出现类型不匹配错误。
就是说
a是一个int类型的变量,在父类和子类中都存在,但是它们分别是独立的。b是一个int类型的变量在父类中,而在子类中是char类型的,类型不同会导致赋值时出现问题。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中使用类对实体进行描述,类经过实例化之后的产物对象,就可以用来表示现实中的实体,描述的事物错综复杂,事物之间可能会存在一些关联,因此我们就需要将他们共性抽取,面向对象的思想中提出了继…...
Cadence笔记--原理图导入PCB
1、以PMU6050为例,首先在原理图双击PMU6050器件,在PCB_Footprint目录填写PCB封装名称并且保存,如下图所示: 2、确保原理图命名的名称不一样,否则会出错,这里PMU6050更改了NC等名称,如下图所示&a…...
从AI生成内容到虚拟现实:娱乐体验的新边界
引言 在快速发展的科技时代,娱乐行业正经历一场前所未有的变革。传统的娱乐方式正与先进技术融合,创造出全新的沉浸式体验。从AI生成的个性化内容,到虚拟现实带来的身临其境的互动场景,科技不仅改变了我们消费娱乐的方式…...
【Linux】gdb_进程概念
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
安全类脚本:拒绝ssh暴力破解
要求如下: 一个小时内,连续密码错误4次。 Linux lastb 命令用于列出登入系统失败的用户相关信息。 实验过程如下: 1. 创建两个IP地址不同的干净环境,分别是: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(集中式工作流) 所有开发者都与同一个中央仓库同步代码,每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件,后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…...
Linux内核编程(二十一)USB应用及驱动开发
一、基础知识 1. USB接口是什么? USB接口(Universal Serial Bus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电…...
什么是数据仓库?
什么是数据仓库? 数据仓库(Data Warehouse,简称DW)是一种面向分析和决策的数据存储系统,它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储,为数据分析、报表生成以及商业智能(…...
计算机网络 (48)P2P应用
前言 计算机网络中的P2P(Peer to Peer,点对点)应用是一种去中心化的网络通信模式,它允许设备(或节点)直接连接并共享资源,而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…...
SK海力士(SK Hynix)是全球领先的半导体制造商之一,其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。
SK海力士(SK Hynix)是全球领先的半导体制造商之一,其在无锡的工厂主要生产DRAM和NAND闪存等存储器产品。以下是SK海力士的一些主要产品型号和类别: DRAM 产品 DDR4 DRAM 特点: 高速、低功耗,广泛应用于PC、服务器和移…...
FunASR 在Linux/Unix 平台编译
第一步拉取镜像并生成容器: ### 镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像: 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中的仓库版本,并在Windows桌面中创建与修改代码,与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法: gen_code仓库 注意,创建仓库时不要设置…...
物联网网关Web服务器--Boa服务器移植与测试
1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…...
vue3学习日记8 - 一级分类
最近发现职场前端用的框架大多为vue,所以最近也跟着黑马程序员vue3的课程进行学习,以下是我的学习记录 视频网址: Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记: vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...
前端实习第二个月小结
时间飞快,第一次实习已经过去两个多月,作一些简单的总结和分享。 注:文章整体会比较轻松,提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务,技术栈:前端re…...
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术 导语 卷积神经网络(CNN)是现代深度学习领域中最重要的模型之一,特别在计算机视觉(CV)领域具有革命性的影响。无论是图…...
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...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
