学习JavaEE的日子 day14 继承,super(),this(),重写

Day14

1.继承的使用

理解:子类继承父类所有的属性和方法

使用场景:多个类似的类,有相同的属性和方法,就可以把相同属性和方法抽取到父类

优点:减少代码的冗余; 使类与类之间产生了关系(多态的前提)

缺点:继承会增加类与类之间的关系,会增加代码的维护难度

需求:编写中国人和日本人的类,创建各自的对象

分析:

  人类:

  	属性:姓名、性别、年龄

  	方法:吃饭饭、睡觉觉

  中国人的类 继承 人类 :

  	属性:身份证

  	方法:打太极

  日本人的类 继承 人类:

  	属性:年号

​ 方法:拍电影

//父类
public class Person {
	
	String name;
	char sex;
	int age;
	
	public void eat(){
		System.out.println(this.name + "吃饭饭");
	}
	
	public void sleep(){
		System.out.println(this.name + "睡觉觉");
	}
}
//            子类           继承        父类
public class Chinese extends Person{

	String id;
	
	public void playTaiJi(){
		System.out.println("中国人打太极");
	}
}
//			     子类           继承        父类
public class Japanese extends Person{

	String yearNum;
	
	public void playVideo(){
		System.out.println("日本人拍电影");
	}
}
//测试类
public class Test01 {
	public static void main(String[] args) {
		
		//创建对象
		Chinese c = new Chinese();
		
		//操作父类属性
		c.name = "小彭";
		c.sex = '男';
		c.age = 21;
		
		//操作子类属性
		c.id = "1234567890";
		
		//调用父类方法
		c.eat();
		c.sleep();
		
		//调用子类方法
		c.playTaiJi();
		
		System.out.println("-----------------------------");
		
		//创建对象
		Japanese j = new Japanese();
		
		//操作父类属性
		j.name = "波多野结衣";
		j.sex = '女';
		j.age = 18;
		
		//操作子类属性
		j.yearNum = "令和";
		
		//调用父类方法
		j.eat();
		j.sleep();
		
		//调用子类方法
		j.playVideo();
		
	}
}

继承内存图:

在这里插入图片描述

父类空间优先于子类对象产生

在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成员。代码体现在子类的构造方法调用时,一定先调用父类的构造方法

小结

1.继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。

2.继承是在多个类中之间的,使用关键字extends,在父类的非私有属性和方法可以被子类继承

3.java是单继承的

2.继承的深入

面试题

1.创建子类对象,会调用父类的构造方法吗?

2.创建子类对象,为什么会调用父类构造方法?

因为会在子类对象中开辟空间,用于存储父类的成员属性

3.创建子类对象,先调用父类构造方法还是子类构造方法?

先调用子类的构造方法

4.创建子类对象,先完成父类构造方法还是子类构造方法?

先完成父类的构造方法

5.子类对象是否能继承父类所有的属性和方法?

Java官网上,明确表示子类不能继承父类私有化的属性和方法,这是站在使用的角度

实际上,子类能继承父类私有化的属性方法,但是不能直接使用,可以在父类中编写公有方法去调用私有的属性和方法

*值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过在父类中设置get/set方法访问父类的private成员变量。*

public class Father {
private String fatherAttr = "父类私有化属性";

public Father() {
	System.out.println("调用父类的构造方法");
}

public String getFatherAttr() {
	return fatherAttr;
}

public void setFatherAttr(String fatherAttr) {
	this.fatherAttr = fatherAttr;
}

private void method01(){
	System.out.println("父类私有化方法");
}

public void method02(){
	method01();
}
}
public class Son extends Father{

	public Son() {
		//super();//默认实现:调用父类的构造方法,所以首先完成父类构造方法,再执行下一句
		System.out.println("调用子类的构造方法");
	}
}
//测试类
public class Test01 {
  public static void main(String[] args) {
	
	Son son = new Son();
	
	System.out.println(son.getFatherAttr());
	
	son.method02();
  }
}

3.super

理解:super表示父类

super代表的是父类对象的引用,this代表的是当前对象的引用。*

作用:

1.super.属性:在子类中,调用父类的非私有化的成员属性(不常用,因为属性已经私有化了)

2.super.方法:在子类中,调用父类的非私有化的成员方法

3.super():在子类构造方法中的第一句调用父类的非私有化的构造方法

需求:编写中国人和日本人的类,创建各自的对象

public class Person {
	
	private String name;
	
	public Person() {
	}
	
	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void eat(){
		System.out.println(this.name + "吃饭饭");//name这个属性是本类的,所以使用this,而不是super
	}
}
public class Chinese extends Person{

	private String id;
	
	public Chinese() {
	}
	
	public Chinese(String name,String id) {
		super(name);//子类中把父类的成员变量一起有参构造出来,方便使用
		this.id = id;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public void playTaiJi(){
		
		System.out.println(super.getName() + "打太极");//super.属性:用的是分类的成员变量,子类中没有名字这个属性
	}
}
public class Japanese extends Person{

	private String yearNum;
	
	public Japanese() {
	}
	
	public Japanese(String name,String yearNum) {
		super(name);
		this.yearNum = yearNum;
	}

	public String getYearNum() {
		return yearNum;
	}

	public void setYearNum(String yearNum) {
		this.yearNum = yearNum;
	}

	public void playVideo(){
		System.out.println(super.getName() + "拍电影");//super.属性:用的是分类的成员变量,子类中没有名字这个属性
	}
}
public class Test01 {
	public static void main(String[] args) {
	
	//创建对象
	Chinese c = new Chinese("小彭", "1234567890");
	
	//调用父类方法
	c.eat();
	
	//调用子类方法
	c.playTaiJi();
	
	System.out.println("-----------------------------");
	
	//创建对象
	Japanese j = new Japanese("波多野结衣",  "令和");
	
	//调用父类方法
	j.eat();
	
	//调用子类方法
	j.playVideo();
	
}
}

小结 - 编写一个类的步骤:

1.属性

2.私有化属性

3.无参构造

4.有参构造

5.get/set方法

6.其他的方法

3.1 继承后的特点——构造方法

构造方法的名字是与类名一致的。

构造方法的作用是初始化对象成员变量数据的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。(*先有爸爸,才能有儿子*

*继承后子类构方法器特点:子类所有构造方法的第一行都会默认先调用父类的无参构造方法*****

子类构造方法的第一行都隐含了一个super()调用父类无参数构造方法,super()可以省略不写。

3.2 super和this的用法格式

this.成员变量 – 本类的

this.成员方法名() – 本类的

super.成员变量 – 父类的

super.成员方法名() – 父类的

接下来我们使用调用构造方法格式:

this(…) – 调用本类的其他构造方法,根据参数匹配确认

super(…) – 调用父类的构造方法,根据参数匹配确认

注意:

*子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。*

*super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。*

4.重写/复写

理解:在子类中,将父类的方法重新写一遍

子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。*声明不变,重新实现*

应用场景:父类方法不能被改动时,在子类中重新写一遍

条件:

1.在子类中重写父类的方法

2.返回值、方法名、参数列表必须跟父类重写的方法一致

3.访问修饰符不能比父类更严格

面试题:重写(overriding)与重载(overloading)的区别?

重写是发生在子父类继承关系中方法名相同,参数列表相同,返回值相同,子类访问修饰符要大于等于父类的修饰符,子类的异常声明必须小于等于父类的异常声明;

方法重载发生在同一个类中,方法名相同,参数列表不同,返回值无关。

需求:编写中国人和日本人的类,创建各自的对象

public class Test01 {	
	public static void main(String[] args) {
	//创建对象
	Chinese c = new Chinese("小彭", "1234567890");
	
	c.eat();//调用子类重写后的方法
	
	System.out.println("-----------------------------");
	
	//创建对象
	Japanese j = new Japanese("波多野结衣","令和");
	
	j.eat();//调用子类重写后的方法
	
}
}
public class Person {
	
	private String name;
	
	public Person() {
	}
	
	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void eat(){
		System.out.println(this.name + "吃饭饭");
	}
}
public class Chinese extends Person{

	private String id;
	
	public Chinese() {
	}
	
	public Chinese(String name, String id) {
		super(name);
		this.id = id;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	//@Override -- 重写的注解
	//注解:给程序员和系统解释代码信息
	@Override
	public void eat(){
		System.out.println(super.getName() + "吃山珍海味");
	}
}
public class Japanese extends Person{

	private String yearNum;
	
	public Japanese() {
	}
	
	public Japanese(String name,String yearNum) {
		super(name);
		this.yearNum = yearNum;
	}

	public String getYearNum() {
		return yearNum;
	}

	public void setYearNum(String yearNum) {
		this.yearNum = yearNum;
	}

	@Override
	public void eat() {
		System.out.println(super.getName() + "吃生鱼片");
	}
}

4.1 @Override重写注解

@Override:注解,重写注解校验!

这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。

建议重写都加上这个注解,一方面可以提高代码的可读性,一方面可以防止重写出错!

4.2 注意事项

1.方法重写是发生在子父类之间的关系。

2.子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

3.子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

4.父类中的方法使用private,static,final任意修饰符,那么,不能被子类重写。

5.总结

1.继承的使用

2.继承的深入 — 重要

3.super

4.重写

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

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

相关文章

前端实现轮训和长连接

简介 轮训和长连接相关内容可以参考之前的文章消息推送系统。消息推送系统-CSDN博客文章浏览阅读106次。在餐饮行业中,店内应用有pos、厨显屏等,云端应用为对应数据中心。为了实现云端数据和操作指令下发到店内应用,需要有一个系统实现这个功…

群晖nas内网穿透

目录 一、前言 二、操作步骤 (一)查看群晖是否有ipv6地址 (二)下载安装docker (三)docker里面安装ddns-go (四)阿里云官网购买域名 (五)域名解析 阿里…

Yolov8_使用自定义数据集训练模型1

前面几篇文章介绍了如何搭建Yolov8环境、使用默认的模型训练和推理图片及视频的效果、并使用GPU版本的torch加速推理、导出.engine格式的模型进一步利用GPU加速,本篇介绍如何自定义数据集,这样就可以训练出识别特定物体的模型。 《Yolov8_使用自定义数据…

AuxTools - 浮鱼渗透辅助工具箱 V4.2

免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢&#xff…

【学习总结】动力学方程的龙格库塔积分法(含具体例子与代码)

本文仅用于个人学习总结,如有错误请批评指正。 参考资料 徐超江等,常微分方程基础教程,高等教育出版社,2023年。 1、欧拉法 1.1 前向欧拉 欧拉积分部分不用展开介绍,较为简单。直接拍照课本。 1.2 梯形法/隐式格式…

4D毫米波雷达——原理、对比、优势、行业现状

前言 4D 毫米波雷达是传统毫米波雷达的升级版,4D指的是速度、距离、水平角度、垂直高度四个维度。 相比传统 3D 毫米波雷达,4D 毫米波雷达增加了“高度”的探测,将第四个维度整合到传统毫米波雷达中。 4D毫米波雷达被视为未来车载雷达的一…

eBPF运行时安全

引言 eBPF作为当前linux系统上最为炙手可热的技术,通常被用于网络流量过滤和分析、系统调用跟踪、性能优化、安全监控,当下比较知名的项目有Cilium、Falco等。 Cilium 是一个开源的容器网络和安全性项目,致力于提供高效的容器通信和强大的安…

【备战蓝桥杯】探索Python内置标准库collections的使用

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-q0zvWxZtAIdSGZ8R {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

大模型学习之书生·浦语大模型5——基于LMDeploy大模型量化部署实践

目录 大模型部署背景 LMDeploy部署 量化 TurboMind API server 动手实践环节 1.创建开发机 2.创建虚拟环境 3.服务部署 在线转换模型 离线转换 4.TurboMind推理 TurboMindAPI服务 提供了一些API的接口 Gradio Demo演示 API server作为后端 注意这里要同时启动API serv…

7款值得收藏的前端动画特效(附效果图在线预览)

分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas粒子空间特效 基于canvas实现的一款粒子空间特效 该特效初始时会从四周扩散粒子并随时间…

Java_二叉树详解

前言 程序员优劣之间最明显的就是数据结构和算法的掌握程度,二叉树作为数据结构中不可缺少的一员,可见其重要程度.我们一起来简单地学习二叉树吧~ 树型结构 在我们学习二叉树前先了解一下树型结构(二叉树是树型结构中的一种) 树是一种非线性的数据结构,它是有n (n>0) 个…

条码WMS仓储管理系统的价值与优势

在全球化和数字化的时代,企业面临着诸多挑战。在复杂的运营环境中,如何提高运营效率和效果,降低成本,增强竞争力,成为企业关注的焦点。而库存管理作为企业运营的关键环节,其重要性不言而喻。本文将深入探讨…

【PyTorch】PyTorch之Tensors索引切片篇

文章目录 前言一、ARGWHERE二、CAT、CONCAT、CONCATENATE三、CHUNK四、GATHER五、MOVEDIM和MOVEAXIS六、PERMUTE七、RESHAPE八、SELECT九、SPLIT十、SQUEEZE十一、T十二、TAKE十三、TILE十四、TRANSPOSE十五、UNBIND十六、UNSQUEEZE十七、WHERE 前言 介绍常用的PyTorch之Tenso…

【DC-DC】APS54085降压恒流 高辉度调光降压恒流芯片

产品描述 APS54085 是一款 PWM 工作模式,高效率、 外围简单、内置功率 MOS 管,适用于 5-100V 输入的高精度降压 LED 恒流驱动芯片。最大电流 2.0A。 APS54085 可实现线性调光和 PWM 调光, 线性调光有效电压范围 0.52-2.55V. PWM 调光频率范围 100…

山西电力市场日前价格预测【2024-01-19】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-19)山西电力市场全天平均日前电价为499.01元/MWh。其中,最高日前电价为898.49元/MWh,预计出现在18:00。最低日前电价为373.35元/MWh,预计…

elasticsearch 中热词使用遇到的坑

在使用es检索时,一般会创建索引以及索引下mapping和setting一样配置,如下: 命令创建配置方式: PUT /my_index { "settings": { "number_of_shards": 1 }, "mappings": { "properties": { "title": { …

k8s的对外服务--ingress

service作用体现在两个方面 1、集群内部 不断跟踪pod的变化,更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制 2、集群外部 类似负载均衡器,把流量ip端口,不涉及转发url(http,https&a…

Docker-02-镜像项目部署

Docker-02-镜像&项目部署 文章目录 Docker-02-镜像&项目部署一、镜像①:镜像结构②:Dockerfile③:构建镜像01:构建02:查看镜像列表03:运行镜像 二、网络①:容器的网络IP地址②&#xff…

《如何制作类mnist的金融数据集》——0.背景

0.背景 最近在金融人工智能领域进行了研究。由于金融领域数据集的欠缺,因此需要根据其领域中的各种数据的特征进行相应数据集的制作。 下图所示是一篇关于金融与预测的论文,题目为:《预测自动交易的财务信号:一个可解释的方法》。…

分享用is_sorted()解决单调数列问题

题目名称 896. 单调数列 目录 题目名称 896. 单调数列 1.题目 2.题目分析 3.题目知识 3.1 is_sorted() 3.2.迭代器与反向迭代器 3.2.1理解迭代器 3.2.2正向迭代器 3.2.3反向迭代器 最后🍨 推荐阅读顺序: 1.题目->2.题目分析->3.题目知识点 1.题目 如…