extends继承

目录

什么时候用继承?

继承的格式?

继承的特点

子类可以继承父类的哪些呢?

是否可以继承父类的构造方法呢?

是否可以继承成员变量?

是否可以继承成员方法?


在Java中,extends关键字用于实现继承关系。通过使用extends关键字,一个类可以继承另一个类的属性和方法。

继承允许我们通过创建更具体的子类来扩展和改进现有的类。子类可以访问父类中的公共方法和属性,并可以添加自己的方法和属性。通过继承,我们能够实现代码的重用性,并可以更好地组织和管理程序的结构。

什么时候用继承?

 当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

继承的格式?

public class 子类extends 父类{}

继承的特点

 Java只支持单继承,不支持多继承,但支持多层继承。
多层继承:子类A继承父类B,父类B可以继承父类
每一个类都直接或者间接的继承于0bject 类

子类可以继承父类的哪些呢?

是否可以继承父类的构造方法呢

下面我们来一探究竟

先来个父类

class Fu{
    String name;
    int age;
    public Fu(){

    }
    public  Fu(String name,int age){
        this.name=name;
        this.age=age;

    }
}

再来个子类

class Zi extends Fu{

}

下面我们就来测试一下

可以看到带参构造创建的子类对象报错了

idea建议我们创建一个构造方法

那上面的空参构造为什么没有报错呢?

一个类中如果没有构造方法,虚拟机会自动的给我们添加一个默认的空参构造

是否可以继承成员变量?

成员变量可以被继承。在面向对象编程中,子类继承父类时可以继承父类的成员变量。当子类继承父类时,子类将会拥有父类的所有成员变量和成员方法,包括私有的成员变量。子类对象可以直接访问继承下来的成员变量,或者通过父类的公用方法来间接访问。需要注意的是,如果子类需要对继承的成员变量进行修改,可以使用继承下来的成员变量进行赋值,或者通过继承过来的成员方法来操作。

是否可以继承成员方法?

虚方法表中的可以,否则不行

虚方法表(Virtual Method Table,VMT)是一种用于实现面向对象编程语言中的多态性的机制。在这些编程语言中,对象的方法可以被子类重写以实现不同的行为。虚方法表通过一个表格来记录对象的方法,这个表格中的每一项指向实际执行的方法。当使用对象的方法时,编译器会根据对象的类型在虚方法表中查找相应的方法,并调用它。

虚方法表是面向对象编程语言中的一个重要概念,它使得多态性得以实现。通过将方法的调用与方法的实际实现解耦,虚方法表允许程序在运行时动态地确定要调用的方法。

在很多面向对象编程语言中,每个对象都有一个指向其所属类的虚方法表的指针。这个指针指向一个特定类的虚方法表,在表中,每个方法都被分配了一个唯一的索引。当对象的方法被调用时,程序会根据对象的类型查找相应索引对应的方法,并调用它。

虚方法表的使用方便了对象的方法的重写和动态绑定,使得多态性得以实现。它是实现面向对象编程语言中的多态性的一种常用机制。

继承中成员变量的访问特点

就近原则:谁离我近,我就用谁

先在局部位置找,本类成员位置找,父类成员位置找,逐级往上。

我们在代码中看看

先写个Fu类

public class Fu {
    String name = "Fu";
}

再写个Zi类

public class Zi extends Fu {
    String name = "Zi";

    public void ziShow() {
        String name="ziShow";

        System.out.println(name);
    }
}

这个输出的结果会是什么呢 ?

下面我们进行测试

public class Test4 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.ziShow();

    }
}

可以看到,输出结果为ziShow

离它最近的是ziShow

如果我将Zi类中的String name="ziShow";删掉

这样答案又会是什么呢?

根据就近原则,他就会打印Zi

如果我将Zi类中的String name="Zi"也删掉

答案又会是什么?

它就会去Fu类中去寻找最近的

如果Fu类中也没有的话它就会报错

那我如果想将这三个name都输出出来该怎么办呢?

我们只需要这样输出就好了

System.out.println(name);//从局部位置开始往上找
System.out.println(this.name);//从本类成员位置开始往上找
System.out.println(super.name);//从父类成员位置开始往上找

继承中成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁
super调用,直接访问父类

我们来写个例子看看

先写个Person类

public class Person {
    public void eat(){
        System.out.println("吃米饭,吃菜");
    }
    public void drink(){
        System.out.println("喝水");
    }
}

再写个Student类

public class Student extends Person{
    public void lunch(){
        eat();
        drink();
    }
}

测试一下

public class Test5 {
    public static void main(String[] args) {
        Student student = new Student();
        student.lunch();
    }
}

结果为

先在本类中査看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法

我们再Student类中加上super

super是直接去父类中寻找

如果现在我将Student类中的代码改为

public class Student extends Person{
    public void lunch(){
        this.eat();
        this.drink();
        super.eat();
        super.drink();
    }
    public void eat(){
        System.out.println("吃牛排");
    }
    public void drink(){
        System.out.println("喝可乐");
    }
}

person类中还是

public class Person {
    public void eat(){
        System.out.println("吃米饭,吃菜");
    }
    public void drink(){
        System.out.println("喝水");
    }
}

 又会输出什么呢?

this先在本类中査看eat和drink方法,一看有就直接调用子类的方法了

super直接从父类中找eat和drink方法


到这里就要介绍方法的重写了

方法的重写

 当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法

@Override重写注解
1.@Override是放在重写后的方法上,校验子类重写时语法是否正确

2.加上注解后如果有红色波浪线,表示语法错误。

3.建议重写方法都加@Override注解,代码安全! 

public class Person {
    public void eat(){
        System.out.println("吃米饭,吃菜");
    }
    public void drink(){
        System.out.println("喝水");
    }
}
public class Student extends Person{
    public void lunch(){
        this.eat();
        this.drink();
        super.eat();
        super.drink();
    }
    @Override
    public void eat(){
        System.out.println("吃牛排");
    }
    @Override
    public void drink(){
        System.out.println("喝可乐");
    }
}

方法重写注意事项和要求

  1. 重写方法的名称、形参列表必须与父类中的一致。
  2. 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 建议:重写的方法尽量和父类保持一致。
  5. 私有方法不能被重写。
  6. 子类不能重写父类的静态方法,如果重写会报错的。

5、与6、可以理解为只有被添加到虚方法表中的方法才能被重写 

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WInForm —— 自定义画板

项目模板:要实现在背景和无背景上完成画线&#xff0c;画直线、矩形、椭圆、并能随意调整字体的大小 首先要定义绘制的类型 enum DrawMode {None, // 没有选择绘制型Pen, // 画笔 画直线Line,// 画直线Rectangle,// 画矩形Ellipse, // 画椭圆Rubber // 橡皮擦 } //如果要想…

【Linux】进程的优先级及linux下进程的调度于切换

目录 ​编辑 1.优先级是什么 2.linux中的优先级是怎么实现的 ps -la 命令查看当前用户启动的进程​编辑 linux下调整优先级&#xff1a; ①先top一下 ②点击r ③需要输入进程的pid ④回车 ​编辑 ⑤输入想将优秀级修改的值&#xff1a; linux进程优先级范围为什么必须是【60,9…

Navicat的安装与破解

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

《系统分析与设计》实验-----需求规格说明书 哈尔滨理工大学

文章目录 需求规格说明书1&#xff0e;引言1.1编写目的1.2项目背景1.3定义1.4参考资料 2&#xff0e;任务概述2.1目标2.2运行环境2.3条件与限制 3&#xff0e;数据描述3.1静态数据3.2动态数据3.3数据库介绍3.4数据词典3.5数据采集 4&#xff0e;功能需求4.1功能划分4.2功能描述…

Java——封装、访问修饰符、包

目录 一.封装的概念 二.访问限定符 三.封装扩展之包 1.包的概念 2.导入包中的类 3.自定义包 4.包的访问权限控制举例 5.常见的包 一.封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&am…

linux进阶篇:文件查找的利器——grep命令+管道操作详解

Linux文件查找的利器——grep命令管道操作详解 1 grep简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。 Uni…

Java面试八股文(更新中emsp;)(❤❤)

Java面试八股文 一. 基础篇1. Java语言特点2. 面向对象和面向过程的区别3. 八种基本数据类型的大小&#xff0c;以及他们的封装类4. 标识符的命名规则5. instanceof 关键字的作用6. Java自动装箱与拆箱面试题1&#xff1a; 以下代码会输出什么&#xff1f;面试题2&#xff1a;以…

Linux 网络测速

1.开发背景 网络测速&#xff0c;为了测试开发板的网络速度是否达标的通用测试方法 2.开发需求 搭建 iperf3 &#xff0c;在 ubuntu 下安装服务端&#xff0c;在板卡上安装客户端&#xff0c;服务端和客户端互发 3.开发环境 ubuntu20.04 嵌入式开发板&#xff08;debian 千…

用c++实现串匹配问题、选择排序

5.2.2 串匹配问题 【问题】 给定两个字符串S和T&#xff0c;在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配&#xff09;&#xff0c;T称为模式。在文本处理系统、操作系统、编译系统、数据库系统以及 Internet 信息检索系统中&#xff0c;串匹配是使用最频…

记录flume运行时报NullPointerException异常

【背景说明】 我要起一个将kafka上的topic_log主题中的数据上传到hdfs上的flume进程。 这是我的flume配置文件脚本&#xff1a; #定义组件 a1.sourcesr1 a1.channelsc1 a1.sinksk1#配置source1 a1.sources.r1.type org.apache.flume.source.kafka.KafkaSource a1.sources.r…

JAVA基础06-面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)

面向对象的概念以及特征 概念 实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起来, 一切以对象为中心语言。 面向对象的程序设计过程中有两个重要概念&#xff1a;类&#xff08;class&#xff09;和对象&#xff08;也称为实例&#xff09;。 其中…

YOLO-World——S

文章目录 Abstract成果 MethodPre-training Formulation: Region-Text PairsModel ArchitectureYOLO DetectorText EncoderText Contrastive HeadTraining with Online VocabularyInference with Offline Vocabulary Re-parameterizable Vision-Language PANText-guided CSPLay…

强烈推荐 ——电脑终端管理系统

强烈推荐&#xff01;电脑终端管理系统 电脑终端管理系统使用的目的是为了管控电脑上硬件和软件资产&#xff0c;以及员工使用电脑的行为&#xff0c;最终目的是为了保护企业资产和信息&#xff0c;以下是一些推荐的电脑终端管理系统&#xff0c;这些系统为企业提供了强大的功…

C语言基础入门案例(2)

目录 第一题&#xff1a;编写一个基于switch语句的等级评估程序 第二题&#xff1a;学生成绩评定 第三题&#xff1a;计算圆的周长和面积 第四题&#xff1a;将三个整数按从大到小顺序输出 第五题&#xff1a;打印九九乘法表 第一题&#xff1a;编写一个基于switch语句的等…

TXT文本批量高效编辑,支持给文章结尾进行添加上相同的结语,轻松应对多个文本

在信息爆炸的时代&#xff0c;我们每天面对大量的文本信息&#xff0c;无论是工作文档、新闻稿件还是社交媒体内容&#xff0c;都需要进行高效、精准的编辑。而XT文本批量编辑器正是您理想的助手&#xff0c;它支持批量高效编辑&#xff0c;更能在文章结尾添加上您想要的相同结…

Knowledge Editing for Large Language Models: A Survey

目录 IntroductionProblem Formulation评估指标Methods数据集应用讨论挑战未来方向 大型语言模型&#xff08;LLMS&#xff09;最近由于其出色的理解&#xff0c;分析和生成文本的能力而根据其广泛的知识和推理能力来改变了学术和工业景观。然而&#xff0c;LLM的一个主要缺点是…

韩顺平Java | C25 JDBC和连接池(上)

概述 JDBC概述&#xff1a;JDBC为访问不同数据库提供统一接口&#xff0c;为使用者屏蔽细节问题。Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 // 模拟代码 //JdbcInterface.java --Java规定的JDBC接口(方法) p…

计算机网络——抓取icmp包

前言 本博客是博主用于记录计算机网络实验的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 抓包 我们是用Wireshark工具来进行抓包的。 ​在安装时候一路打勾安装即可&#xff0c;不过最后那个因为是英文&#xff0c;一定要看清&#xff0c;点了立即重启&am…

采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示

采用C#.Net JavaScript 开发的云LIS系统源码 二级医院应用案例有演示 一、系统简介 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0…

【UE5.1】使用MySQL and MariaDB Integration插件——(2)查询

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;1&#xff09;连接MySQL&#xff09;基础上继续实现查询MySQL数据表功能。 效果 步骤 1. 这里先新建一个控件蓝图&#xff0c;命名为“WBP_OperateDB”&#xff0c;该界面用于在连接数据…