【java学习—七】关键字super(32)

news2024/11/28 11:50:51

文章目录

  • 1. 功能
  • 2. 代码中理解
  • 3. super调用父类构造器
    • 3.1. 结论一证明
    • 3.2. 结论二证明
  • 4. this和super的区别


1. 功能

  • 在 Java 类中使用 super 来调用父类中的指定操作:
    (1)super 可用于访问父类中定义的属性
    (2)super 可用于调用父类中定义的成员方法
    (3)super 可用于在子类构造方法中调用父类的构造器

注意:
(1)尤其当子父类出现同名成员时,可以用super进行区分
(2)super 的追溯不仅限于直接父类,在多层继承中,使用super,子类可以调用子类之上所有的父类
(3)super 和 this 的用法相像, this 代表本类对象的引用, super 代表父类的内存空间的标识

2. 代码中理解

层级关系:Kk(子类)–>Kids(父类)–>ManKind(父类的父类)

代码:
ManKind类

package day07;

public class ManKind {
	int sex;
	int salary;
	
	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	public void manOrWoman() {
		if(this.sex == 1) {
			System.out.println("man");
		}else if(this.sex == 0) {
			System.out.println("Woman");
		}
	}
	
	public void employeed() {
		if(this.salary == 0) {
			System.out.println("no job");
		}else {
			System.out.println("job");
		}
	}

}

Kids类

package day07;

public class Kids extends ManKind {
	int yearsOld;
	
	public int getYearsOld() {
		return yearsOld;
	}

	public void setYearsOld(int yearsOld) {
		this.yearsOld = yearsOld;
	}

	public void printAge() {
		System.out.println(this.yearsOld);
	}

	public static void main(String[] args) {
		Kids someKid = new Kids();
		someKid.setSex(0);
		someKid.setSalary(100);
		
		someKid.manOrWoman();
		someKid.employeed();
	}
}

Kk类

package day07;

public class Kk extends Kids {
	public void test() {
		
		//追溯 ManKind类中的salary变量
		super.salary = 1;//可以使用super向上追溯父类的父类;如果有多个层级的父类的话,可以一直向上追溯
		//追溯 Kids类中的yearsOld变量
		super.yearsOld = 1;//可以使用super直接追溯使用父类的成员变量

		//追溯 Kids类中的employeed方法
		super.employeed();//可以使用super直接追溯使用父类的成员方法

		//追溯 ManKind类中manOrWoman方法
		super.manOrWoman();//可以使用super直接追溯使用父类的父类的成员方法;如果有多个层级的父类的话,可以一直向上追溯
	}

}

练习

  1. 修改上述例题中定义的 类Kids中 employed() 方法,在该方法中调用父类 ManKind 的 employed() 方法,然后再输出“ but Kids should study and no job.”
package day07;

public class Kids extends ManKind {
	int yearsOld;
	
	@Override
	public void employeed() {
		// TODO Auto-generated method stub
		super.employeed();//调用父类的employeed
		System.out.println("but Kids should study and no job.");
	}


	public static void main(String[] args) {
		Kids someKid = new Kids();
		someKid.employeed();//调用子类的employeed
	}
}

输出结果:
在这里插入图片描述

3. super调用父类构造器

三条结论
(1)子类中所有的构造器默认都会访问父类中空参数的构造器。
(2)当父类中没有空参数的构造器时,子类的构造器必须通过 this(参数列表) 或者 super(参数列表) 语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。
(3)如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

3.1. 结论一证明

举例:(1)子类中所有的构造器默认都会访问父类中的无参构造器。
在父类ManKind中创建一个 空参数构造器

package day07;

public class ManKind {
	//创建空参数构造器
	public ManKind() {
		System.out.println("ManKind");
	}
	
	int sex;
	int salary;
	
	
	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}

	public void manOrWoman() {
		if(this.sex == 1) {
			System.out.println("man");
		}else if(this.sex == 0) {
			System.out.println("Woman");
		}
	}
	
	
	public void employeed() {
		if(this.salary == 0) {
			System.out.println("no job");
		}else {
			System.out.println("job");
		}
	}
	
}

子类Kids:

package day07;

public class Kids extends ManKind {
	int yearsOld;

	public static void main(String[] args) {
		Kids someKid = new Kids();//new Kids()是在调用Kids类的默认无参构造方法,这个过程就会使用到父类的无参构造
	}
	
}

运行结果:
在这里插入图片描述

当然,也可以在子类中显示地调用父类的构造器

package day07;

public class Kids extends ManKind {
	//显示地调用父类的构造器
	public Kids() {
		super();
	}
	
	int yearsOld;

	public static void main(String[] args) {
		Kids someKid = new Kids();
	}
	
}

3.2. 结论二证明

举例:(2)当父类中没有空参数的构造器时,子类的构造器必须通过 this(参数列表) 或者 super(参数列表) 语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。

父类:显示创建有参构造器

package day07;

public class ManKind {
//	public ManKind() {
//		System.out.println("ManKind");
//	}
	
	//当存在显示的构造方法时,类就没有默认的无参构造了,而是要使用显示的构造
	public ManKind(int sex, int salary) {
		this.sex = sex;
		this.salary = salary;
	}
	
	int sex;
	int salary;
	
	
	
	public int getSex() {
		return sex;
	}


	public void setSex(int sex) {
		this.sex = sex;
	}


	public int getSalary() {
		return salary;
	}


	public void setSalary(int salary) {
		this.salary = salary;
	}


	public void manOrWoman() {
		if(this.sex == 1) {
			System.out.println("man");
		}else if(this.sex == 0) {
			System.out.println("Woman");
		}
	}
	
	
	public void employeed() {
		if(this.salary == 0) {
			System.out.println("no job");
		}else {
			System.out.println("job");
		}
	}

}

此时,如果把上一个例子中Kids中的构造器注释掉的话,程序会报错:提示添加一个‘Kids(int,int)’构造器。如下图所示:
在这里插入图片描述
给Kids中添加有参构造器:

package day07;

public class Kids extends ManKind {
	
	public Kids(int sex, int salary) {
		//在父类只有有参构造可以使用的时候,子类必须显示的创建一个构造来调用父类的有参构造,
		//并且调用父类构造方法要写在第一行
		super(sex, salary);
		// TODO Auto-generated constructor stub
	}


	int yearsOld;

	public static void main(String[] args) {
		Kids someKid = new Kids();

	}
}

4. this和super的区别

序号区别thissuper
访问属性访问本类中的属性,
如果本类没有此属性则从父类中继续查找
访问父类中的属性
调用方法访问本类中的方法直接访问父级中的方法
调用构造器调用本类构造器,必须放在构造器首行调用父类构造器,必须放在子类构造器的首行
特殊表示当前对象无此概念

注意:
根据③:在子类中,通过this或者是super调用构造器,只能使用一个,因为都要占据第一行

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

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

相关文章

unity的脚本执行顺序问题

当一个物体同时挂载有多个脚本时,谁会先执行呢? 猜想:Test2在Test1的上面应该会先执行吧! 结果:Test1先执行 如果你想要某一个脚本先执行,可以使用Awake方法 执行顺序 是先把所以脚本的Awake执行完&a…

【Transformer系列】深入浅出理解ViT(Vision Transformer)网络模型

一、参考资料 极智AI | 详解 ViT 算法实现 MobileViT模型简介 ECCV 2022丨力压苹果MobileViT,这个轻量级视觉模型新架构火了 ECCV 2022丨轻量级模型架构火了,力压苹果MobileViT(附代码和论文下载) 再读VIT,还有多少细…

学习笔记---超基础+详细+新手的顺序表~~

目录 1.顺序表的前言 1.1 顺序表--->通讯录📇 1.2 数据结构的相关概念🏇 1.2.1 什么是数据结构 1.2.1 为什么需要数据结构 2. 顺序表概念及分类 2.1 顺序表的概念🐙 2.2 顺序表的分类🐫 2.2.1 顺序表和数组的区别 2.…

c++ 学习之多态

来看代码 我们来看看早绑定的代码 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Animal { public:void speak(){cout << "动物在说话 " << endl;} }; class Cat : public Animal { public:void speak() {cout…

android studio检测不到真机

我的情况是&#xff1a; 以前能检测到&#xff0c;有一天我使用无线调试&#xff0c;发现调试有问题&#xff0c;想改为USB调试&#xff0c;但是半天没反应&#xff0c;我就点了手机上的撤销USB调试授权&#xff0c;然后就G了。 解决办法&#xff1a; 我这个情况比较简单&…

LD链接脚本

1.LD链接脚本的简介 LD链接脚本的概念 LD链接器脚本在完整程序编译流程中的链接过程使用。LD链接器脚本定义了程序各个程序段的存储分布&#xff0c;描述链接器如何将这些目标文件.o文件链接成一个输出可执行文件LD链接器脚本与CPU的种类、MCU的内部存储器分布有关。 LD链接…

华为---企业WLAN组网基本配置示例---AC+AP组网

ACAP组网所需的物理条件 1、无线AP---收发无线信号&#xff1b; 2、无线控制器(AC)---用来控制管理多个AP&#xff1b; 3、PoE交换机---能给AP实现网络连接和供电的交换机&#xff1b; 4、授权&#xff1a;默认AC管理的AP数量有限&#xff0c;买授权才能管控更多AP。 WLAN创建…

思维模型 峰终定律

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。 1 峰-终定律的应用 1.1 迪士尼游乐园 迪士尼乐园采用了多种策略来创造令人难忘的体验&#xff0c;从而遵循峰终定律的原则。具体如下&#xff1a; 迪士尼乐园的入口设计和服务体验&…

E047-论坛漏洞分析及利用-针对Wordpress论坛进行信息收集与漏洞扫描的探索

任务实施: E047-论坛漏洞分析及利用-针对Wordpress论坛进行信息收集与漏洞扫描的探索 任务环境说明&#xff1a; 服务器场景&#xff1a;p9_kali-6&#xff08;用户名&#xff1a;root&#xff1b;密码&#xff1a;toor&#xff09; 服务器场景操作系统&#xff1a;Kali Li…

零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频

谷歌podcast有很多播客音频&#xff0c;如何批量下载到电脑呢&#xff1f; 以这个播客为例&#xff1a; https://podcasts.google.com/feed/aHR0cHM6Ly9oYWRhcnNoZW1lc2guY29tL2ZlZWQvcG9kY2FzdC8?saX&ved0CAkQlvsGahcKEwi4uauWsvKBAxUAAAAAHQAAAAAQAg 查看网页源代码&a…

【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历

给你一棵二叉树的根节点root 返回其节点值的后序遍历 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1]…

智慧公厕厂家,解读智慧厕所的全面功能应用

近年来&#xff0c;随着城市化进程的加速&#xff0c;智慧公厕的建设与发展成为了城市管理的重要一环。作为城市的门面和城市基础设施的重要组成部分&#xff0c;智慧公厕不仅能够满足人们基本的生理需求&#xff0c;更能提升城市形象和居民生活品质。那么&#xff0c;智慧公厕…

堆专题4 堆排序

题目&#xff1a; 样例&#xff1a; 输入 5 2 8 5 1 3 输出 1 2 3 5 8 思路&#xff1a; 由题意&#xff0c;堆的排序&#xff0c;就是结合向下或向上调整的方式&#xff0c;调整堆顺序&#xff0c;全部的各个部分都变为 顶堆形式。不同的是&#xff0c;由于我们是顶堆原理&a…

学信息系统项目管理师第4版系列28_组织级项目管理和量化项目管理

1. OPM 1.1. 旨在确保组织开展正确项目并合适地分配关键资源 1.1.1. 有助于确保组织的各个层级都了解组织的战略愿景、实现愿景的措施、组织目标以及可交付成果 1.2. 业务评估是建立OPM框架的必要组件 1.3. OPM3 是组织级项目管理成熟度模型&#xff0c;可用于评估组织项目…

华为OD机考算法题:开心消消乐

题目部分 题目开心消消乐难度易题目说明给定一个 N 行 M 列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为 0 或 1&#xff0c;矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#xff0c;规则如下&#xff1a; 1) 当点击一…

互联网Java工程师面试题·Java 总结篇·第一弹

目录 1、面向对象的特征有哪些方面&#xff1f; 2、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff09;时的区别&#xff1f; 3、String 是最基本的数据类型吗&#xff1f; 4、float f3.4;是否正确&#xff1f; 5、short s1 1; s1 s1 1;有错吗…

Deno 下一代JavaScript运行时

目录 1、简介 2、Deno 的特点 3、Deno 和 Node 的区别 4、TypeScript开箱即用 5、内置的基本开发工具 独立可执行文件 测试运行器 代码格式化程序 代码linter 6、专为云而建 7、从浏览器到后端的一致代码 TC39 WinterCG 8、高性能联网 9、数百万个社区模块 10、相关框架 1、简介…

Stream流中的 distinct()方法

去除流中重要的元素。依赖&#xff08;hashCode和equals方法&#xff09; Stream流中无法直接修改集合、数组中的数据 package com.csdn.streampractice; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class StreamTest {public …

初级篇—第八章精讲MySQL数据类型

文章目录 MySQL数据类型常见的属性字符集设置数据库的字符设置表的字符集设置字段的字符集设置 整型数据类型可选属性MUNSIGNEDZEROFILL 如何选择&#xff1f; 浮点类型FLOAT 和 DOUBLE 这两种数据类型的区别是啥呢&#xff1f;为什么浮点数类型的无符号数取值范围&#xff0c;…

使用js获取选中的dom元素 并改变选中(有序dom)的状态

一个效果图&#xff0c;一段代码&#xff0c; 就这样吧。 <template><!-- <el-checkbox v-model"">开启双向</el-checkbox> --><divref"checkListRef"mouseup"mouseupCon"mousedown"mousedownCon"mouseov…