Java:继承——继承概念+父子类成员、构造访问顺序+super、this关键字(代码+画图超详解!)

news2024/11/30 10:41:00

一、什么是继承

1、继承的概念

举例理解:

根据打印机的原理,我们可以知道不管是彩色打印机还是黑白打印机,实现的都是一个功能:打印,这是二者的共性。彩色打印机和黑白打印机都继承了打印机的打印功能,且二者在打印机的基础上增加了自己特有的功能。

继承的概念:

        程序员在保持原本特性的基础上进行扩展,增加新功能,产生的新的类,这种类称为派生类,也称为子类,被扩展的类被称为父类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用

2、代码示例

2.1 继承的语法

在Java中要表现类与类间的继承关系,需要借助extends关键字:

修饰符  class  子类  extends  父类  {

        //…………

}

2.2 代码实现

例如:猫和狗都是动物,他们是动物这个类之下的细分。

class Animal {
    //  Animal 是 Cat、Dog 的父类
}
class Cat extends Animal {
    // Cat 是 Animal 的子类
}
class Dog extends Animal {
    // Dog 是 Animal 的子类
}

2.3 注意

1、子类会继承父类中的成员变量或成员方法。

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

class Animal {
    //  Animal 是 Cat、Dog 的父类
    public void eat() {
        System.out.println("吃吃吃");
    }
}
class Cat extends Animal {
    // Cat 是 Animal 的子类
    public void cry() {
        System.out.println("喵喵喵");
    }
}
public class test1 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.eat();    //Cat从Animal中继承了 eat方法,所以可以直接调用
        cat.cry();    
    }

运行结果:

二、super、this 关键字

1、super

作用:在子类方法中访问父类的成员

代码示例:

class Base {
    int a = 10;
    public void methodA() {
        System.out.println("Base————A");
    }
}
class Child extends Base {
    int a = 100;
    public void methodA() {
        System.out.println("Child————A");
    }

    public void method() {
        System.out.println(a);          //100
        System.out.println(super.a);    //10
        methodA();                      //Child————A
        super.methodA();                //Base————A
    }
}

总结:当想明确访问父类中成员时,借助super关键字即可

注意:只能在非静态方法中使用

2、this

作用:想明确访问本类的成员时,借助this关键字即可

代码示例:

class Base {
    int a = 10;
    public void methodA(int a) {
        this.a = a;
        //当前代码中有两个 a,使用this可以明确给成员变量 a 赋值为参数 a 
    }
}

3、super和this的相同与不同

相同点:

1、二者都是Java中的关键字

2、都只能在类的非静态方法中使用,用来访问非静态的成员方法和变量

3、在构造方法中使用时,必须是第一条语句,并且二者不能同时存在

不同点:

1、this是当前对象的引用,当前对象即调用实例方法的对象;super是子类对象中对父类继承下来的部分成员的引用

2、在非静态成员中:this用来访问本类的方法和属性;super用来访问父类继承下来的方法和属性

3、在构造方法中:this(…)用来调用本类的构造方法;super(…)用来调用父类的构造方法;二者不能同时出现

4、构造方法中一定会出现super(…)的调用,用户没有写编译器也会自动添加,而this(…)用户不写就没有

三、父子类成员访问顺序

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

代码示例:

class Animal {
    int age = 0;
    double weight = 5.0;
}
class Cat extends Animal {
    double weight = 9.5;
    String color = "Black";
    String name = "花花";

    public void display() {
        String name = "小黑";
        System.out.println(age);    //0
        System.out.println(weight);     //9.5
        System.out.println(color);      //Black
        System.out.println(name);       //小黑
    }
}

总结:1、父类有子类没有的,访问从父类继承的成员变量

           2、父类有子类也有的,访问子类自己的成员变量

           3、父类没有子类有的,访问子类自己的成员变量

           4、子类父类都没有的,编译报错

           5、局部变量访问优先级高于成员变量

成员变量访问就近原则:自己有先访问自己的,自己没有再去父类中找

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

2.1 成员方法名字不同

代码示例:

class Animal {
    public void methodA() {
        System.out.println("Animal————A");
    }
}
class Cat extends Animal {
    public void methodB() {
        System.out.println("Cat————B");
    }

    public void method() {
        methodA();  //Animal————A
        methodB();  //Cat————B    
        //methodC();//编译报错
    }
}

总结:成员方法名不同时,在子类方法中或通过子类对象访问时,优先访问自己的,自己没有的时候再到父类中找,如果父类中也没有,则报错。

2.1 成员方法名字相同

代码示例:

class Animal {
    public void methodA() {
        System.out.println("Animal————A");
    }

    public void methodB() {
        System.out.println("Animal————B");
    }
}
class Cat extends Animal {
    public void methodA(int num) {
        System.out.println("Cat————A");
    }
    public void methodB() {
        System.out.println("Cat————B");
    }

    public void method() {
        methodA();      //Animal————A
        methodA(1);     //Cat————A
        methodB();      //Cat————B
    }
}

总结:1、方法同名时,如果参数列表相同,则就近访问

           2、如果参数列表不同,则根据参数选择合适的方法访问(方法的重载)

           3、如果没有该方法就报错

四、父子类构造访问顺序

父子即先有父,后有子。子类对象构造时,需先调用父类的构造方法。

代码示例:

class Base {
    public Base() {
        System.out.println("Base构造方法");
    }

}

class Child extends Base {
    public Child() {
        //super();
        //没写时编译器会自动添加 且一定是方法中的第一条语句
        System.out.println("Child构造方法");
    }
}

所以当我们要实例化一个Child类的对象时,会先后输出:

因为在Child类的构造方法中,会自动添加super()在第一条语句,调用父类的构造方法。

        所以我们可以知道,在我们构造子类对象时,先执行父类的构造方法,再执行子类的构造方法

注意:

1、若父类定义无参或默认的构造方法,则在子类构造方法的第一条默认会有隐含的super()调用。

2、如果父类定义的是有参的构造方法,则在子类中一定要显示定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。

3、在子类构造方法中,super(…)调用父类构造时,必须为方法中第一条语句

4、super(…)只能在子类构造中出现一次,不能与this(…)同时出现。

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

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

相关文章

基于T1w/T2w 比值揭示髓磷脂相关变化

前言: 最近在阅读文献的时候发现2篇文章,是采用T1w/T2w 比值表征髓磷脂,有点感兴趣,因此尝试了一下文献所提出的方法。(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9247578/ https://www.ncbi.nlm.nih.gov/pmc/ar…

vue的网络请求以及封装

①先备好springboot的接口 ②安装依赖 在vue中安装网络请求工具的依赖&#xff1a; npm i axios③简单的demo 直接通过axios请求尝试一下&#xff1a; <script> import axios from "axios";export default {name: HomeView,data() {return {users:[]}}, …

言语残疾和言语残疾分级

言语残疾和言语残疾分级 言语残疾&#xff0c;指各种原因导致的不同程度的言语障碍&#xff0c;经治疗一年以上不愈或病程超过两年&#xff0c;而不能或难以进行正常的言语交流活动&#xff0c;以致影响其日常生活和社会参与。包括&#xff1a;失语、运动性构音障碍、器质性构音…

app移动应用开发

1.案例7.安安的通讯助手 目标 组件设计 素材准备 所有组件的说明及属性设置&#xff08;1&#xff09; 所有组件的说明及属性设置&#xff08;2&#xff09; 所有组件的说明及属性设置&#xff08;3&#xff09;布局小技巧 行为逻辑设计 自动回复短信 短信收发器 组件 记录已收…

MongoDB部署策略

内 容 简 介 本文介绍了MongoDB数据库的优点的数据存储模式的安装部署过程。 利用MongoDB在存储海量数据上的优势&#xff0c;部署存储空间大数据。 欢迎批评指正补充 由于编者水平有限&#xff0c;所搜集资料也很有限&#xff0c;制定的规范肯定有考虑不周全、甚至完全错误…

利用路由懒加载和CDN分发策略对极客园项目进行性能优化

文章目录 前言1.配置路由懒加载2.项目资源打包3.包体积可视化分析4.cdn配置 总结 前言 极客园项目的完成之后&#xff0c;我们需要对项目进行打包以及性能优化&#xff0c;优化用户体验以及加快响应时间&#xff0c;本文只列举了路由懒加载和cdn分发的策略 1.配置路由懒加载 …

Spring Security学习(四)——登陆认证(包括自定义登录页)

前言 和前面的文章隔了很长时间才更新Spring Security系列&#xff0c;主要原因一个是之前太忙了&#xff0c;把项目都忙完了&#xff0c;赶上春节假期&#xff0c;就慢慢研究。Spring Security的体系非常复杂&#xff0c;一口吃不了热豆腐&#xff0c;没办法速成&#xff0c;…

​StableSwarmUI#超越文本的prompt

今天看到一个新的webui方案&#xff0c;是Stability-AI开源的&#xff1a; StableSwarmUI 是一个模块化的稳定扩散web用户界面&#xff0c;着重于使强大的工具易于访问、高性能和可扩展性。 由于项目还在开发中&#xff0c;我们可以先了解下&#xff0c;翻看了它的特点&#xf…

年假作业11

一、选择题 ADDAADADC&#xff0c;BD,D,B,BD,D,C,CD 二、填空题 6 2&#xff0c;3,5,7,9 rgb *s, - a 2,5 *s 三、编程题 1、 #include <iostream> using namespace std; int main() {int arr[10]{10,20,30,40,50,60,70,80,90,100};int m;//从标准输入读取一个…

[职场] 应聘销售的简历怎么写 #职场发展#笔记

应聘销售的简历怎么写 应聘销售的简历怎么写1 基本信息 姓名&#xff1a;吴x 性别&#xff1a;女 毕业院校&#xff1a;徐州师范大学计算机科学院 学历&#xff1a;大专 联系电话&#xff1a;电子邮件&#xff1a; 工作经验&#xff1a;4年 求职意向 期望从事职业&#xff1a;销…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第三天-ARM Linux ADC和触摸屏开发 (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、ADC S3C2440的A/D转换器包含一个8通道的模拟输入转换器&#xff0c;可以将模拟输入信号转换成10位数字编码。 在A/D转换时钟频率为2.5MHz时&…

ClickHouse--10--临时表、视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 1.临时表 1.1 特征 ClickHouse 支持临时表&#xff0c;临时表具备以下特征&#xff1a; 当…

7 大 Android 数据恢复软件,可轻松找回丢失的数据

每年&#xff0c;由于各种原因&#xff0c;数百万人从他们的 Android 设备中丢失数据。它可能像意外删除文件一样简单&#xff0c;也可能像系统崩溃一样复杂。在这种情况下&#xff0c;拥有高效的数据恢复工具可以证明是救命稻草。Mac 用户尤其需要找到与其系统兼容的软件。好消…

D. Divisible Pairs

思路&#xff1a;我们预处理出每个数分别摸上xy的值&#xff0c;用map存一下&#xff0c;然后遍历每个数&#xff0c;如果a b是x的倍数的话&#xff0c;那么他们模x的值相加为x&#xff0c;如果a - b是y的倍数的话&#xff0c;那么他们的模y的值相等。 代码&#xff1a; voi…

Python dict函数

Python中的字典&#xff08;dict&#xff09;是一种非常重要且灵活的数据结构&#xff0c;它提供了键值对的存储和访问机制。字典函数&#xff08;dict()&#xff09;作为创建字典的工具之一&#xff0c;可以从多种数据结构中创建字典对象。在本文中&#xff0c;将深入探讨dict…

[OPEN SQL] 删除数据

DELETE语句用于删除数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要删除以下数据 1.删除单条数据 语法格式 DELETE <dbtab> FROM <wa>. DELETE <dbtab> FROM TABLE <itab>. DELETE FROM &…

【白话前端】JS库的作用和常见的九种类型—值得收藏

js库就好比预制菜&#xff0c;我们想吃美食没必要从买菜、择菜、炒菜开始&#xff0c;直接加工就行。 一、什么是JS库 JS库&#xff08;JavaScript Library&#xff09;是指一组封装好的函数、方法、类等&#xff0c;用于简化开发者的编程工作。它们通常提供了常用的功能和算…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-消息队列queue

目录 一、消息队列基本概念二、消息队列运行机制三、消息队列开发流程四、消息队列使用说明五、消息队列接口六、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、消息队列基本概念 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构。队列接收来自任务…