JAVA基础08- 继承,重写,super以及this

目录

继承(extends)

定义

说明

作用

方法的重写

定义

重写关键点

方法重写与重载的区别

练习

练习1(方法继承与重写的简单练习)

练习2(方法继承与重写的进阶练习)

This的使用

定义

作用以及注意事项

super引用

定义

super关键点

super与this关系

继承链的属性值内存分析

思考

图解分析


继承(extends)

定义

子类继承父类,目的子类扩展父类的属性以及方法,就是为了实现代码的复用

1.子类可以继承父类的有权限访问的属性以及方法

2.所有的引用类型都默认继承超类Object(所有的引用类型的超父类为Object【祖宗类】)

说明

1.子类继承父类的所有东西?不是 ;应该是子类有权限继承的属性和方法,所以,一般来说父类中的属性和方法设置为public

2.Java中只有单继承,没有多继承,但是有继承链

举例:Doctor --> Person --> Object 

作用

1、实现代码复用、减少代码冗余 

2、方便维护 

3、多态的前提


方法的重写

定义

子类重写父类的方法(子类覆盖父类的方法),凸显出子类的行为特征

方法重写跟修饰符、方法名、参数列表、返回值类型都有关系

【两同--方法名、方法参数列表、一大--权限修饰符、两小---返回值类型,异常类型】

重写关键点

1.方法名相同、方法参数列表相同

2.和方法修饰符、返回值类型有关

3.子类重写父类的方法,子类方法的权限修饰符比父类的大或者相等

4.子类重写父类的方法,子类的返回值类型比父类的小或者相等【引用类型】【基本数据类型要一致】

5.子类重写父类的方法,子类的抛出的异常类型要比父类的小或者相等

注意:当子类中有和父类一样的私有化方法,那么子类的私有化方法是一个普通方法,并不是重写了父类的方法

方法重写与重载的区别

1.重写:子类重写父类方法,凸显出子类的行为特征;

重载:在同一个类中,同一种行为的不同的体现

2.方法重写存在于继承链中,方法重载存在于同一个类

3.方法重写是和修饰符以及返回值是有关系的,而方法重载是没有关系的

4.方法重写方法名和参数列表是一样的,但是方法重载是方法名一致,参数列表不一致


练习

练习1(方法继承与重写的简单练习)

定义一个动物类Animal name、sex、age--定义eat方法()

//动物类
public class Animal {// name、sex、agepublic String name;public String sex;public int age;// --定义eat方法()void eat() {System.out.println("Animal eat....");}//方法重写跟修饰符、方法名、参数列表、返回值类型都有关系【两同、一大、两小】public Object test() throws Exception {return "";}
}

--定义一个鸟类Bird,继承动物类,子类重写父类的eat方法

--在鸟类中定义一个移动方法move()

public class Bird extends Animal {//方法重写//子类重写的方法的权限修饰符大于等于父类的方法@Override//方法重写的标志注解public void eat() {System.out.println("Bird eat....");}//定义一个移动方法public void move() {System.out.println("鸟通过飞行进行移动!");}//方法重写,主要目的是突出子类的行为特征【体现子类与父类的行为不一致】@Override//方法重写的标志注解public String test() throws Exception {return "";}
}

--定义一个狗类Dog,继承动物类,子类重写父类的eat方法

public class Dog extends Animal {public void eat() {System.out.println("Dog eat....");}
}

--定义一个鸵鸟类ostrich 继承鸟类 ,重写鸟类的move方法

//鸵鸟继承鸟类
public class Ostrich extends Bird {// 定义一个移动方法public void move() {System.out.println("鸵鸟通过奔跑进行移动!");}public void move(int hours) {System.out.println("鸵鸟通过奔跑进行移动"+hours+"小时");}//鸵鸟重写动物父类中的eat方法@Overridepublic void eat() {System.out.println("Ostrich eat....");}
}

 测试类

public class AnimalMain {public static void main(String[] args) {// AnimalAnimal animal = new Animal();animal.eat();// 创建一个子类的对象Bird bird = new Bird();bird.eat();}
}

练习2(方法继承与重写的进阶练习)

父类:汽车Car:

车型、载人数量、载货重量

--载客方法(乘客人数)

--载货方法(货物重量)

//父类  汽车类
public class Car {// 属性车型、载人数量、载货重量public String type;public int num;public double weight;// --载客方法(乘客人数)public void CarryPassenger(int carryNum) {System.out.println("当前乘客人数为:" + carryNum);}// --载货方法(货物重量) 吨public void CarryProduction(double carryWeight) {System.out.println("当前载货重量为:" + carryWeight + "吨");}
}

轿车:famCar

重写父类的载客方法【设置载客条件:当乘客数量满足2人则启动】

class famCar extends Car {// 重写父类的载客方法【设置载客条件:当乘客数量满足2人则启动】public void CarryPassenger(int carryNum) {if (carryNum > num) {System.out.println("载客人数超载,请注意安全!");return;// 结束方法}if (carryNum >= 2) {System.out.println("小轿车载客人数满足,开始出发!");}}
}

大巴车:Bus

重写父类的载客方法【设置载客条件:当乘客数量满足20人则启动】

class Bus extends Car {// 重写父类的载客方法【设置载客条件:当乘客数量满足20人则启动】public void CarryPassenger(int carryNum) {if (carryNum > num) {System.out.println("载客人数超载,请注意安全!");return;// 结束方法}if (carryNum >= 20) {System.out.println("大巴的载客人数满足,开始出发!");}}
}

货车:Truckt

重写父类的载货方法【设置载货条件:当载货量达到3吨则启动】

定义载货的重载方法(运送利润金额)【设置载货条件:当运送利润金额达到3000元则启动】

class Truckt extends Car {// 重写父类的载货方法【设置载货条件:当载货量达到3吨则启动】@Overridepublic void CarryProduction(double carryWeight) {if (carryWeight > weight) {System.out.println("载货重量超载,请注意安全!");return;// 结束方法}if (carryWeight >= 3) {System.out.println("货车载货重量满足,开始出发!");}}// 定义载货的重载方法(运送利润金额)【设置载货条件:当运送利润金额达到3000元则启动】public void CarryProduction(int price) {if (price >= 3000) {System.out.println("货车单次运送利润金额达到3000元,开始出发!");}}
}

测试类

public class CarMain {public static void main(String[] args) {// 使用货车运送物资Truckt truckt  = new Truckt();truckt.type = "大东风";truckt.num = 4;truckt.weight = 20;truckt.CarryProduction(5.5);// 使用货车运送商品【单次利润为5000元】truckt.CarryProduction(5000);}
}

This的使用

定义

this表示的是调用当前方法的实例对象的引用[谁调用了这个方法,则this就表示为谁]

this:在哪里使用?构造器中、非静态方法

作用以及注意事项

1、用于区分同名的成员变量和局部变量

	// 就近原则:当前代码块中找--》当前类中找 --》往父类-曾父类。。找 --》//若没找到则编译错误// 用于区分同名的成员变量和局部变量public ItGuy(String n, double w) {name = n;//会去先找当前代码块有无name,再到当前类,再到父类...祖宗类wealth = w;}

2、在本类的非静态方法中调用静态的属性以及方法可以省略对象,原因是省略this.

// 在非静态方法中调用非静态属性及方法时,可以省略this.public void test() {System.out.println(this.name);//Cannot use this in a static contexttest1();// 相当于this.test1();}

3、可以使用this调用本类另一个构造器,但是要注意构造器的调用必须要在构造器的第一行。

	public ItGuy(String id, String name, double wealth) {this(name, wealth);//Constructor call must be the first statement in a constructorthis.id = id;}	
// this也可以用调用本类中的另一个构造器,并要放在第一行!public ItGuy(String name, double wealth) {this.name = name;//this表示调用当前方法的引用对象this.wealth = wealth;}

注意this不能在static修饰的代码块中使用(原因:this是一个对象的引用,是真实存在的;在static的代码块中this不能指向明确的真实对象)


super引用

定义

super表示为调用了当前方法的对象的父类对象的引用【父类的引用对象】

super关键点

重点:在java中创建对象时,首先会先创建父类的对象,再创建本类的对象

1.super可以调用父类的构造器,必须要在构造器的第一行

2.super可以调用父类的属性和方法

3.父类的成员变量存放在父类的对象,而不是在子类的对象中;

4.而子类中定义的成员变量,还是存放在子类的对象

【成员变量由始至终都是只有一个

super与this关系

1.super和this一样,都表示为一个对象引用,所以不能在静态代码块中使用

2.在构造器中super();写和不写都一样,因为系统会默认调用父类的无参构造器创建父类的对象

public class Person {public String id;public String name;public double wealth;public void eat() {System.out.println("Person 吃饭");}public Person(String id, String name, double wealth) {super();this.id = id;this.name = name;this.wealth = wealth;}public Person() {super();}	
}
public class Student extends Person {//2、super可以用于调用父类的构造器【在创建一个类之前,会先创建该父类的对象引用】// 创建一个stu,先创建Object,再创建Person、最后才是studentpublic Student(String id, String name, double wealth) {super();//super(); 写和不写都是存在的【默认都是调用父类的无参构造器】this.id = id;this.name = name;this.wealth = wealth;
//		super(id, name, wealth);//与上面三行同一个作用}public Student() {super();}public void eat() {System.out.println("Student 吃饭");}//定义一个方法用于调用父类的eat方法//1、用于调用父类的方法及属性public void superEat() {super.eat();}
}
//测试类,测试如何调用父类方法
public class PersonMain {public static void main(String[] args) {//Student stu = new Student("001", "zhang", 456);stu.eat();//调用子类(当前类的方法)stu.superEat();//调用父类的方法}
}

继承链的属性值内存分析

思考

在继承链中,变量是否有重写?this.name和super.name的关系是怎么样以及结果是怎么样 ?

答案:是没有重写变量的概念,只有非静态成员变量是属于哪个类的对象

顺序问题:现在子类对象中找,如果子类对象中没有则认为是父类对象的】

//继承链值测试类
public class Student extends Person {public String name;public Student(String id, String name, double wealth) {super();//super(); 写和不写都是存在的【默认都是调用父类的无参构造器】this.id = id;this.name = name;this.wealth = wealth;}public Student() {super();}public void superEat() {System.out.println("this.name="+this.name);//zhang  //当前有name属性,构造器给当前name赋值,所以super没有赋值到,为nullSystem.out.println("super.name="+super.name);//null//当前类无id属性,根据顺序,去找父类id赋值,因此子类父类都有值System.out.println("this.id="+this.id);//本类无id,去父类person找idSystem.out.println("super.id="+super.id);}
}
//测试类,测试如何调用父类方法
public class PersonMain {public static void main(String[] args) {Student stu = new Student("001", "zhang", 456);stu.superEat();//调用方法测试值}
}

图解分析

如果子类有定义,先调用子类的并赋值。(即为这里的name)


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

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

相关文章

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入&#xff…

搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统

产品概述 煤矿安全知识基础学习VR系统 系统内容: 煤矿安全知识基础学习VR系统内容包括:下井流程(正确乘坐罐笼、班前会、井下行走注意事项、工作服穿戴、入井检身及人员清点、下井前准备工作、提升运输安全);运煤流程…

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测 目录 EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实…

动手写sql 《牛客网80道sql》

第1章&#xff1a;SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件&#xff0c;用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

1&#xff0e; 按键亮灯 设计 GPIO 实验项目 1&#xff0c;功能&#xff1a;当按键 KB1 按下时&#xff0c;实验板上全彩发光二极管周边 的发光二极管全亮&#xff0c;当按键 KB2 按下时跑马灯 D0 闪亮。 实验要求基于寄存器的GPIO配置&#xff0c;所以需要手动操作寄存器来配…

联想小新Air14-2019锐龙版更换硬盘

首先打下D面所有螺丝&#xff08;内六角螺丝&#xff0c;需要准备螺丝刀&#xff09;&#xff0c;然后从下方翘起整个D面打开如下图 原装为2280长度的海力士硬盘&#xff0c;有空余的2242长度硬盘位 更换前断电&#xff0c;建议拆下电池&#xff08;扣下电池排线后不好安装&am…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

百科不全书之 docker记录

docker记录 1 参考文件2. Docker简介与虚拟机的区别 1 参考文件 参考视频&#xff1a;B站【GeekHour】30分钟Docker入门教程: link 2. Docker简介 Docker是一个用于构建运行 传送 应用程序的平台。 与虚拟机的区别 虚拟机使用了一种叫做虚拟化的技术。每台虚拟机需要占…

固定测斜仪:工程观测的精密利器

在工程观测测量领域&#xff0c;固定测斜仪扮演着至关重要的角色。固定测斜仪&#xff0c;凭借其耐冲击型倾斜传感器、出色的可靠性、快速稳定的特点&#xff0c;以及简洁的安装和智能识别功能&#xff0c;已成为行业内重要工具。其输出信号为RS485数字量&#xff0c;可直接显示…

使用electron打包vuecli创建的项目

下面是我打包的时候才过的所有的坑&#x1f4a3;&#xff1a; 首先创建一个vue2的空项目&#xff0c;如果全局安装的vue-cli版本太低&#xff0c;低于3就无法使用vue create命令&#xff0c;必须使用uninstall将之前的卸载掉&#xff0c;在重现安装&#xff0c;之后的就是最近…

握手问题(蓝桥杯)

文章目录 握手问题【问题描述】答案&#xff1a;1204解题思路模拟 握手问题 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#…

Scrapy框架内存泄漏问题及解决

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、问题背景及原因 官方文档&#xff1a;Debugging memory leaks — Scrapy 2.11.1 documentation Scrapy是一款功能强大的网络爬虫框…

SpringMVC 常用注解介绍

Spring MVC 常用注解介绍 文章目录 Spring MVC 常用注解介绍准备1. RequestMapping1.1 介绍2.2 注解使用 2. 请求参数2.1 传递单个参数2.2 传递多个参数2.3 传递对象2.4 传递数组 3. RequestParam3.1 注解使用3.2 传入集合 4. RequestBody5. PathVariable6. RequestPart7. Rest…

k8s使用harbor私有仓库镜像 —— 筑梦之路

官方文档: Secret | Kubernetes ImagePullSecrets的设置是kubernetes机制的另一亮点&#xff0c;习惯于直接使用Docker Pull来拉取公共镜像&#xff0c;但非所有容器镜像都是公开的。此外&#xff0c;并不是所有的镜像仓库都允许匿名拉取&#xff0c;也就是说需要身份认证&…

23 种设计模式

设计模式 1、工厂方法 消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、建造者模式 建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一…

【electron3】electron将数据写入本地数据库

安装 yarn add sqlite3 --save连接并调用数据库&#xff0c;创建表 createDB.ts文件内容 const sqlite3 require(sqlite3) const NODE_ENV process.env.NODE_ENV const path require(path) const { app } require(electron) let DB_PATH path.join(app.getAppPath(), /…

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…