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.mzph.cn/news/818211.shtml

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

相关文章

24年重庆三支一扶报名照不通过怎么处理?

24年重庆三支一扶报名照不通过怎么处理&#xff1f;

Laravel 11入门:使用ServBay打造高效开发环境

Laravel 11发布&#xff0c;改进了不少功能。 它引入了更加流畅的应用结构、每秒限速、健康路由等特性。 此外&#xff0c;Laravel还推出了第一方可扩展的WebSocket服务器Laravel Reverb&#xff0c;为你的应用提供强大的实时功能。 在今天的指南中&#xff0c;我将设置一个…

L1-003 个位数统计 C语言

感觉看的那些模板在写非当时指定的题的时候&#xff0c;很难用的上&#xff0c;可能还是培养那种思维吧&#xff0c;还是勤学多练&#xff0c;这样就能融会贯通&#xff0c;把学的慢慢用上&#xff0c;慢慢来吧&#xff0c;着急没用的 这里因为个不超过 1000 位的正整数 N&…

ASP.NET基于BS课件发布系统

摘 要&#xff1a;本文在分析建立动态网站的技术细节和课件发布工作流程的基础上&#xff0c;阐述了网站的结构与功能设计。本网站采用的是B/S结构&#xff0c;网站使用 Microsoft Visual Studio .NET2003作为主要开发工具&#xff0c;采用Dreamweaver 作为辅助开发工具实现网…

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务&#xff0c;它提供了一项基本服务&#xff1a;分布式锁服务。分布式应用可以基于它实现更高级的服务&#xff0c;实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…

3_3.Apache的管理及优化web

### 一.Apache的作用 ### 在web被访问时通常使用http://的方式 http:// ##超文本传输协议 http:// 超文本传输协议提供软件&#xff1a; Apache nginx stgw jfe Tengine ### 二.Apache的安装 ### dnf install httpd.x86_64 -y ### 三.Apache的启用 ### systemctl enable --…

一、Nginx部署

Nginx部署 一、Docker部署1.复制Nginx配置文件2.启动Nginx容器 一、Docker部署 1.复制Nginx配置文件 # 1.拉取镜像 docker pull nginx # 2.启动nginx容器 docker run --restartalways --namenginx -p 80:80 -d nginx # 3.宿主机创建挂载目录 mkdir /root/docker/nginx -p # 4…

C语言 03 VSCode开发

安装好 C 语言的开发环境后&#xff0c;就需要创建项目进行开发了。 使用 IDE&#xff08;集成开发环境&#xff09;进行开发了。 C 语言的开发工具很多&#xff0c;现在主流的有 Clion、Visual Studio、VSCode。 这里以 VSCode 作为演示。 创建项目 安装 VSCode。 推荐直接在…

【C语言】<动态内存管理>我的C语言终末章

&#xff1c;动态内存管理&#xff1e; 1. 为什么要有动态内存分配2. malloc和free2.1 malloc2.2 free 3. calloc和realloc3.1 calloc3.2 realloc 4.常见的动态内存错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释…

链表超详解

链表 链表 链表 用途&#xff1a;解决前驱后继类的问题 复杂度&#xff1a;插入删除 O ( 1 ) O(1) O(1) 查找 O ( N ) O(N) O(N)。 例子&#xff1a; 插入&#xff1a;A后面是B,B后面是C编码实现&#xff1a; map<char,char> next; next[A]B;next[B]C;删除B,则A后…

Navicat的安装与破解

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

openEuler-22.03 软件包安装

1、更换软件源 /etc/yum.repos.d/openEuler.repo 默认的一般不需要换 [rootlocalhost ~]# cat /etc/yum.repos.d/openEuler.repo #generic-repos is licensed under the Mulan PSL v2. #You can use this software according to the terms and conditions of the Mulan PSL…

linux下常见解压命令gz、tar、zip详解

常见解压缩命令汇总 # .tar.gz解压 tar -zxvf jdk-17_linux-aarch64_bin.tar.gz # .tar.gz压缩 tar -czvf archive.tar.gz /path/to/directory# .gz解压 gzip -d file.gz # .gz压缩 gzip filename# zip解压 unzip filename.zip # zip压缩 zip archive.zip /path/to/file.tar.g…

累积分布函数图(CDF)的介绍、matlab的CDF图绘制方法(附源代码)

在对比如下两个误差的时候&#xff0c;怎么直观地分辨出来谁的误差更低一点&#xff1f;&#xff1a; 通过这种误差时序图往往不容易看出来。 但是如果使用CDF图像&#xff0c;以误差绝对值作为横轴&#xff0c;以横轴所示误差对应的累积概率为纵轴&#xff0c;绘制曲线图&am…

【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)

个人主页&#xff1a; 进朱者赤 阿里非典型程序员一枚 &#xff0c;记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; 目录 题目描述思路及实现方式一&#xff1a;快速选择排序思路代码实现Java版本C语言版本P…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置&#xff0c;最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 &#xff08;1&#xff09;经典大佛图 具体txt文…

【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

洛谷P1364医院设置

洛谷P1364 医院设置 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约…

vue--双向数据绑定原理

Vue采用数据劫持 发布者-订阅者模式实现双向数据绑定&#xff0c;实现逻辑图如下所示&#xff1a; 数据劫持 Vue 借助Object.defineProperty()来劫持各个属性&#xff0c;这样一来属性存取过程都会被监听到 发布者-订阅者模式 主要实现三个对象&#xff1a;Observer&#…

Android 系统编译 and 应用裁剪

平台应用编译 平台应用demo的Android.mk写法: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# Only compile source java files in this apk. LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := TestLOCAL_CER…