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();}@Overridepublic void eat(){System.out.println("吃牛排");}@Overridepublic void drink(){System.out.println("喝可乐");}
}

方法重写注意事项和要求

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

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

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go gin框架(详细版)

目录 0. 为什么会有Go 1. 环境搭建 2. 单-请求&&返回-样例 3. RESTful API 3.1 首先什么是RESTful API 3.2 Gin框架支持RESTful API的开发 4. 返回前端代码 go.main index.html 5. 添加静态文件 main.go 改动的地方 index.html 改动的地方 style.css 改动…

洛谷 P9532 [YsOI2023] 前缀和

题目背景 Ysuperman 模板测试的试机题。 小心立秋&#xff0c;小心秋丽。 题目描述 立秋有一个长度为 n 的数组 a&#xff0c;所有数字都是正整数&#xff0c;并且除了其中第一个数字以外其它数字都等于前面所有数字的和。 例如&#xff0c;数组 [1,1,2,4,8,16] 就有可能是…

基于U-Net的图像分割算法介绍

U-Net是一种用于图像分割的深度学习架构,其设计初衷是用于生物医学图像分割,尤其是医学影像中的细胞分割任务。U-Net结构独特,具有编码器-解码器结构,能够有效地捕捉图像中的局部和全局信息,并在像素级别上进行精确的分割。 相关论文: U-Net: Convolutional Networks for…

RISCV指令集体系简读之RV32I

RV32I 指令格式 用于寄存器-寄存器操作的R类型指令用于短立即数和访存load操作的I型指令用于访存store操作的s型指令用于条件跳转操作的B类型指令用于长立即数的U型指令用于无条件跳转的J型指令 特点&#xff1a; 所有指令都是32bits&#xff0c; 简化了指令解码&#xff1b;…

Python数据可视化库—Bokeh与Altair指南【第161篇—数据可视化】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和数据分析领域&#xff0c;数据可视化是一种强大的工具&#xff0c;可以帮助我们…

Mac电脑安装蚁剑

1&#xff1a; github 下载源码和加载器&#xff1a;https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面&#xff1a;antSword为源码…

关于SpringCloud,你了解多少?

Why SpringCloud&#xff1f; Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 spring boot 的开发风格做到一…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#x…

通用设计的四大原则,大厂设计师带案例讲解!

作为数字产品设计师&#xff0c;在进行产品设计时要考虑产品的各种因素&#xff0c;例如功能、美观、安全等&#xff0c;要尽可能地满足所有用户的需求&#xff0c;做出对所有用户都尽可能公平的解决方案。但是&#xff0c;对于新手来说&#xff0c;在实际进行产品设计时&#…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定&#xff0c;导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台&#xff0c;包括无人机app以及仿司空2的管理平台&#xff0c;集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

Redis中的BigKey

Redis中的BigKey 文章目录 Redis中的BigKey什么是BigKey&#xff1f;BigKey的危害找到Bigkey删除BigKey优化BigKeyBigKey对持久化的影响对AOF日志的影响对AOF重写和RDB的影响 什么是BigKey&#xff1f; 大 key 并不是指 key 的值很大&#xff0c;而是 key 对应的 value 很大。…

【GPU】冲击高性能

计算量估计 卷积神经网络复杂度分析 卷积神经网络CNN中的参数量&#xff08;parameters&#xff09;和计算量&#xff08;FLOPs &#xff09; Roofline Model Roofline Model与深度学习模型的性能分析 有了上面这些基础知识&#xff0c;再来往下分析会更有收获 发现问题 — …