“手撕“三大特性之一的<继承>(上)

news2024/11/16 21:52:20

目录

一、为什么需要继承

二、什么是继承

三、继承怎么写

四、成员的访问

1.父类与子类的成员变量不同名

2.父类与子类的成员变量同名 

3.父类与子类的成员方法不同名

4.父类与子类的成员方法同名 

五、super关键字


一、为什么需要继承

先让我们看一段Java代码:

// Dog.java
public class Dog{
    string name;
    int age;
    float weight;

public void eat(){
    System.out.println(name + "正在吃饭");
}
public void sleep(){
    System.out.println(name + "正在睡觉");
}
void Bark(){
    System.out.println(name + "汪汪汪~~~");
}
}

// Cat.Java
public class Cat{
    string name;
    int age;
    float weight;

public void eat(){
    System.out.println(name + "正在吃饭");
}
    public void sleep()
{
    System.out.println(name + "正在睡觉");
}
void mew(){
    System.out.println(name + "喵喵喵~~~");
}
}

我们会发现有大量的代码是相同的。比如:名字年龄体重啊,吃饭睡觉啊。所以我们思考,有没有一种更加简便的写法,把大家都有的东西抽取出来,可以实现代码的复用(就是大家都可以用)减少了程序员的工作量。  

有,那就是继承

二、什么是继承

 

把公共的东西抽取出来,让对象去获得公共的东西(名字年龄吃饭等等)就叫做继承。对于抽取出来的东西做成一个类,我们叫做父类,对于自己额外有的东西(比如:狗狗的汪汪汪,猫猫的喵喵喵)做成一个类,我们叫做子类。 有什么好处呢?就是可以实现代码的复用,提高工作效率。

三、继承怎么写

继承的关键字是extend。具体如下:

 修饰符 class 子类 extends 父类 {

        // ...

}

所以对于上面狗狗和猫猫可以怎么继承呢?代码如下: 

// 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.sleep();
    dog.bark();
}
}

1.子类会将父类的东西全部继承下来(也可以说copy下来了)。

2.子类需要有自己额外的共性(比如汪汪汪),不然就没必要继承了。 

四、成员的访问

1.父类与子类的成员变量不同名

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

2.父类与子类的成员变量同名 

public class Base {
    int a;
    int b;
    int c;
}
/
public class Derived extends Base{
    int a; // 与父类中成员a同名,且类型相同
    char b; // 与父类中成员b同名,但类型不同
public void method(){
    a = 100; // 访问子类新增的a
    b = 101; // 访问子类新增的b
    c = 102; // 子类没有c,访问的肯定是从父类继承下来的c
 // d = 103; // 编译失败,因为父类和子类都没有定义成员变量b
}
}

 所以我们可以发现规律:

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

3.父类与子类的成员方法不同名

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

4.父类与子类的成员方法同名 

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

我们依旧可以发现规律(与成员变量相同):

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

五、super关键字

既然假设子类有的话,就不会访问到父类。那我就想访问父类怎么办?这时候super关键字就孕育而生了。super的作用就是用来在子类的方法中访问父类的东西。 

public class Base {
    int a;
    int b;
public void methodA(){
    System.out.println("Base中的methodA()");
}
public void methodB(){
    System.out.println("Base中的methodB()");
}
}
public class Derived extends Base{
    int a; // 与父类中成员变量同名且类型相同
    char b; // 与父类中成员变量同名但类型不同
// 与父类中methodA()构成重载
public void methodA(int a) {
    System.out.println("Derived中的method()方法");
}
// 与基类中methodB()构成重写(即原型一致,重写后序详细介绍)
public void methodB(){
    System.out.println("Derived中的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()
}
}

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

注意: super跟this一样,只能在非静态方法中使用。

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

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

相关文章

【大模型应用极简开发入门(1)】LLM概述:LLM在AI中所处位置、NLP技术的演变、Transformer与GPT、以及GPT模型文本生成逻辑

文章目录 一. AI中大语言模型的位置与技术发展1. 从AI到Transformer2. NLP:自然语言处理3. LLM大型语言模型:NLP的一种特定技术3.1. LLM定义3.2. LLM的技术发展3.2.1. n-gram模型3.2.2. RNN与LSTM 二. Transformer在LLM中脱颖而出1. Transformer架构能力…

不敢说懂你 - Glide硬核源码剖析

问题 Glide加载流程? Glide整体架构? Glide数据加载的来源? Glide缓存加载的流程? Glide线程切换原理? Glide如何感知Activity? Glide哪种情况会返回应用级的RequestManager? … 带着一些问题去阅读… 使用示例 本篇主要基于glide:4.12.0进行分析。下面是Gli…

[论文阅读链接]

CVPR2023:Learning Human-to-Robot Handovers from Point Clouds http://t.csdnimg.cn/OfSnShttp://t.csdnimg.cn/OfSnS仿真工具:dm_control: Software and Tasks for Continuous Control dm_control 翻译: Software and Tasks for Continuous Control…

python免费调用阿里云通义千问(q-wen-max)大模型API

文章目录 通义千问开通免费API Keypython调用阿里云通义千问API 通义千问 通义千问,是基于阿里巴巴达摩院在自然语言处理领域的研究和积累。采用更先进的算法和更优化的模型结构,能够更准确地理解和生成自然语言、代码、表格等文本。 支持更多定制化需…

js 特定索引下拆分字符串并组建成新的字符串数据

要在特定索引处拆分字符串,请使用 slice 方法获取字符串的两个部分,例如 str.slice(0, index) 返回字符串的一部分,但不包括提供的索引,而 str.slice(index) 返回字符串的其余部分。 过程:我们创建一个可重用的变量&a…

Linux-用户管理类命令实训

查看根目录下有哪些内容 进入/tmp目录,以自己的学号建一个目录,并进入该目录 像是目前所在的目录 在当前目录下,建立权限为741的目录test1 在目录test1下建立目录test2/test3/test4 进入test2,删除目录test3/test4 (7&…

paddle.net怎么付款?paddle.net怎么订阅?

有需要的小伙伴可以使用Fomepay的卡进行订阅支付,我这里使用的是491090卡段,开卡步骤很简单,点击获取卡片 1、注册 2、填写姓名使用拼音或者英文名都可以 3、支付宝或者微信支付

JavaWeb-登录校验

会话技术 浏览器使用的是http协议,多次请求间数据是不能共享的,例如我们要去访问用户数据的接口,但这时候用户是否已经登入了呢?是不知道的,为了解决这个问题,于是引入了会话跟踪技术。 会话:…

一次Ambari安装记录

引言 Ambari是一个开源的Apache项目,它提供了一个直观易用的Web界面,用于管理、监控和配置Apache Hadoop集群。它是一个集群管理工具,可以帮助管理员轻松地部署、管理和监控Hadoop集群的各种组件,如HDFS、YARN、MapReduce、Hive、HBase等。通过Ambari,用户可以在集群中添…

【GPTs分享】GPTs分享之Image Recreate | img2img​

简介 该GPT是一个专门用于图像编辑、重建和合并的工具。它通过详细的自动图像描述和生成,帮助用户从源图像中重现或修改图像。此工具设计用于为视障用户提供图像内容的详细描述,并生成全新的图像,以满足特定的视觉需求。 主要功能 \1. 图像…

存储人视角:人工智能AI + 大模型

原文来自于知乎存储专栏: 存储人视角:人工智能AI 大模型 前沿 我的角色 背景 AI 出场 效果 一个宠娃狂魔 娃喜爱并有奥特曼玩具 她的奥特曼玩具会跳舞了 娃对我的崇拜和爱又多了一分......amazing 杭州网商路艾弗森 球队需要制作LOGO 形象生动…

【学习】对于加密接口、签名接口如何进行性能测试

随着科技的飞速发展,加密接口和签名接口在我们的日常生活中扮演着越来越重要的角色。从在线支付到信息安全,它们始终默默地守护着我们的数字世界。然而,随着应用场景的不断扩展,性能测试变得尤为重要。今天,让我们一起…

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论:一般用inner join来改写in和exist,用left join来改写not in,not exist;(本文会比较内连接,包含in子句的子查询,exist的性能 ) 1. 本文总结自高性能mysql 6…

PLC中连接外部现场设备和CPU的桥梁——输入/输出(I/O)模块

输入(Input)模块和输出(Output)模块简称为I/O模块,数字量(Digital,又称为开关量)输入模块和数字量输出模块简称为DI模块和DQ模块,模拟量(Analog)输…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

Linux学习第52天:Linux网络驱动实验(二):一往(网)情深

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记的目录如下&#xff1a; 四、I.MX6ULL网络驱动简介 1.I.MX6ULL网络外设设备树 2.I.MX6ULL网络驱动源码简析 3.fec_netdev_ops操作集 4.Linux内核PHY子…

删除word中下划线的内容

当试卷的题目直接含答案&#xff0c;不利用我们刷题。这时如果能够把下划线的内容删掉&#xff0c;那么将有利于我们复习。 删除下划线内容的具体做法&#xff1a; ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…

OSI网络七层协议 ——(随手笔记)

1.OSI OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层…

【论文阅读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…