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

news2024/11/30 9:00:24

目录

继承(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、age
	public 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方法
	@Override
	public void eat() {
		System.out.println("Ostrich eat....");
	}
}

 测试类

public class AnimalMain {
	public static void main(String[] args) {
		// Animal
		Animal 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吨则启动】
	@Override
	public 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 context
		test1();// 相当于this.test1();
	}

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

	public ItGuy(String id, String name, double wealth) {
		this(name, wealth);//Constructor call must be the first statement in a constructor
		this.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、最后才是student
	public 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没有赋值到,为null
		System.out.println("super.name="+super.name);//null
        //当前类无id属性,根据顺序,去找父类id赋值,因此子类父类都有值
		System.out.println("this.id="+this.id);//本类无id,去父类person找id
		System.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.coloradmin.cn/o/1602880.html

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

相关文章

动态代理,XML,Dom4j

文章目录 动态代理概述特点代码实现实现的关键步骤优点 XML概述作用编写第一个XML文件组成声明元素(标签、标记)属性注释转义字符[实体字符字符区(了解) 约束DTD约束Schema约束名称空间 Dom4jXML解析解析方式和解析器解析方式解析器Snipaste_2024-04-17_21-22-44.png<br /&g…

企业linux-堡垒机与跳板机测试案例-6140字详谈

在开始今天内容前&#xff0c;小编先把专栏前面学的Linux命令&#xff08;部分&#xff09;做了思维导图帮助各位平时的学习&#xff1a; 场景&#xff1a; 运维人员管理三台机器&#xff0c;通过远程连接工具连接上三台机器&#xff0c;也知道这三台机器root密码&#xff0c…

Xshell无法输入命令输入命令卡顿

Xshell是一款功能强大的终端模拟软件&#xff0c;可以让用户通过SSH、Telnet、Rlogin、SFTP等协议远程连接到Linux、Unix、Windows等服务器。然而&#xff0c;在使用Xshell的过程中&#xff0c;我们可能会遇到一些问题。比如输入不了命令&#xff0c;或者输入命令很卡。这些问题…

C++笔记:异常

文章目录 C 运行时错误处理机制及其不足之处C 异常概念异常的使用异常的抛出和匹配原则在函数调用链中异常栈展开匹配原则异常的重新抛出举例演示说明例子一&#xff1a;串联举例演示大部分原则例子二&#xff1a;模拟服务器开发中常用的异常继承体系例子三&#xff1a;异常的重…

千锤百炼之每日算法(一)

目录 题外话 正题 第一题 第一题思路 第一题代码详解 第二题 第二题思路 动态规划 解法一 解法一代码详解 解法二 第三题 第三题思路 第三题代码详解 小结 题外话 从今天开始,每天都会更新算法题,一天就三道题 大家最好采用码形结合的方式,也就是代码和图形结合…

最新最全的Jmeter接口测试必会技能:jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

git出现错误 fail to push some refs to “xxx“

问题产生原因&#xff1a;根据测试猜测造成这一错误的原因是在码云的远程仓库上删除了一个文件,本地没有pull下来,直接进行了commit,commit到本地仓库后,如果在pull下来,也是无法提交的 问题解决办法: 使用 git pull --rebase,拉取远程仓库,并将本地仓库新的提交作为最顶层的提…

C++ 并发编程指南(11)原子操作 | 11.5、内存模型

文章目录 一、C 内存模型1、为什么需要内存模型&#xff1f; 前言 C 11标准中最重要的特性之一&#xff0c;是大多数程序员都不会关注的东西。它并不是新的语法特性&#xff0c;也不是新的类库功能&#xff0c;而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方…

(算法版)基于二值图像数字矩阵的距离变换算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目展示了欧氏距离、城市街区距离和棋盘距离变换的实现方法。通过定义一个距离变换类&#xff0c;对输入图像进行距离变换操作&#xff0c;并生成对应的距离矩阵。在示例中&#xff0c;展示了在一个480x480的全黑背景图像上设…

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…

20240329-2-树模型集成学习TreeEmbedding

树模型集成学习 集成学习主要有两个思想&#xff0c;分别是bagging和boosting。树模型的集成模型都是使用树作为基模型&#xff0c;最常用的cart树&#xff0c;常见的集成模型有RandomForest、GBDT、Xgboost、Lightgbm、Catboost。 概要介绍 RandomForest 随机森林(Random …

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

nginx安装在linux上

nginx主要用于反向代理和负载均衡&#xff0c;现在简单的说说如何在linux操作系统上安装nginx 第一步&#xff1a;安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 第二步&#xff1a; 下载nginx&#xff0c;访问官网&#xff0c;ngin…

在操作系统里面打开了Ubuntu 然后vi编辑器编辑内容后没有效果了

我在vi创建项目后编写 然后一直卡着动不了 如下&#xff08;界面没有卡住 可以其他操作&#xff09; 唉&#xff1a;这是一个初学者到悲哀&#xff1a; 原因&#xff1a;是Windows编写习惯 按了Ctrl s在该系统里面就是停止输入&#xff0c;需要按ctrl q恢复输入

Workerman开启ssl方法如下

参考地址 Workerman开启ssl方法如下-遇见你与你分享 准备工作&#xff1a; 1、Workerman版本不小于3.3.7 2、PHP安装了openssl扩展 3、已经申请了证书&#xff08;pem/crt文件及key文件&#xff09;放在了/etc/nginx/conf.d/ssl下 4、配置文件 location /wss { proxy_set…

使用Java调用音乐开放API,并进行播放

使用Java调用音乐开放API&#xff0c;并进行播放 背景描述 电脑没有下载音乐软件&#xff0c;使用网页播放又不太方便&#xff0c;所有就想着使用Java语言直接调用音乐开放API&#xff0c;然后进行播放音乐。 具体代码如下&#xff0c;包含了注释 package com.lowkey.comple…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…

node.js服务器动态资源处理

一、node.js服务器动态资源处理与静态资源处理的区别&#xff1f; 静态与动态服务器主要区别于是否读取数据库&#xff0c;若然在数据库中的资料处理中将数据转换成可取用格式的结构&#xff0c;也就是说把对象转化为可传输的字节序列过程称为序列化&#xff0c;反之则为反序列…