【JavaSE】面向对象之继承

news2024/11/17 12:45:50

继承

  • 继承概念
  • 继承的语法
  • 父类成员的访问
    • 子类和父类没有同名成员变量
    • 子类和父类有同名成员变量
    • 成员方法名字不同
    • 成员方法名字相同
  • super关键字
  • 子类构造方法
  • super和this
  • 继承方式

继承概念

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

例如:狗和猫都是动物,那么我们就可以将共性的内容进行抽取,然后采用继承的思想来达到共用。
在这里插入图片描述
上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。

继承的语法

在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类 {
	// ...
}

所以对上面图中场景使用继承方式重新设计:
先创建Animal.java文件

public class Animal{
	String name;
	int age;
	float weight;
	public void eat(){
		System.out.println(name + "正在吃饭");
	}
	public void sleep(){
		System.out.println(name + "正在睡觉");
	}
}

然后创建Dog.java文件

public class Dog extends Animal{
	void bark(){
		System.out.println(name + "在汪汪叫~~~");
	}
}

继续创建Cat.Java文件

public class Cat extends Animal{
	void mew(){
		System.out.println(name + "在喵喵叫~~~");
	}
}

最后创建用于测试的 TestExtend.java文件

public class TestExtend {
	public static void main(String[] args) {
		Dog dog = new Dog();
		System.out.println(dog.name);
		System.out.println(dog.age);
		dog.eat();
		dog.sleep();
		dog. Bark();
	}
}

Dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的,Dog访问的eat()和sleep()方法也是从Animal中继承下来的。
注意:

1.子类会将父类中的成员变量或者成员方法继承到子类中了。
2.子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。

父类成员的访问

子类和父类没有同名成员变量

public class Base {
	int a;
	int b;
}
public class Derived extends Base{
	int c;
	public void method(){
		a = 10; // 访问从父类中继承下来的a
		b = 20; // 访问从父类中继承下来的b
		c = 30; // 访问子类自己的c
	}
}

子类和父类有同名成员变量

public class Base {
	int a;
	int b;
	int c;
}

public class Derived extends Base{
	int a; // 与父类中成员a同名,且类型相同
	char b; // 与父类中成员b同名,但类型不同
	public void method(){
		a = 100;
		b = 101; 
		c = 102; 
		d = 103;// 编译失败,因为父类和子类都没有定义成员变量b
	}
}
// 访问父类继承的a,还是子类自己的a?答案是自己的
// 访问父类继承的b,还是子类自己的b? 答案是自己的
// 子类没有c,访问的肯定是从父类继承下来的c

在子类方法中 或者 通过子类对象访问成员时:

如果访问的成员变量子类中有,优先访问自己的成员变量。如果访问的成员变量子类中没有,则访问父类继承下来的,如果父类也没有定义,则编译报错。如果访问的成员变量与父类中成员变量同名,则优先访问自己的。成员变量访问遵循就近原则自己有优先自己的,如果没有则向父类中找。

成员方法名字不同

// Base.java
public class Base {
	public void methodA(){
		System.out.println("Base中的methodA()");
	}
}
// Derived.java
public class Derived extends Base{
	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
	public void methodC(){
		methodB(); // 访问子类自己的methodB()
		methodA(); // 访问父类继承的methodA()
		method(); // 编译失败,在整个继承体系中没有发现方法methodD()
	}
}

总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

成员方法名字相同

// Base.java
public class Base {
	public void methodA(){
		System.out.println("Base中的methodA()");
	}
	public void methodB(){
		System.out.println("Base中的methodB()");
	}
}
// Derived.java
public class Derived extends Base{
	public void methodA(int a) {
		System.out.println("Derived中的method(int)方法");
	}
	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
	public void methodC(){
		methodA(); // 没有传参,访问父类中的methodA()
		methodA(20); // 传递int参数,访问子类中的methodA(int)
		methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),父类的无法访问到
	}
}

注意:

通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。通过子类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错。

super关键字

该关键字主要作用是在子类方法中访问父类的成员。

// Base.java
public class Base {
	int a;
	int b;
	public void methodA(){
		System.out.println("Base中的methodA()");
	}
	public void methodB(){
		System.out.println("Base中的methodB()");
	}
}
// Derived.java
public class Derived extends Base{
	int a; 
	char b; 
	public void methodA(int a) {
		System.out.println("Derived中的method()方法");
	}
	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
	public void methodC(){
		// 对于同名的成员变量,直接访问时,访问的都是子类的
		a = 100; // 等价于: this.a = 100;
		b = 101; // 等价于: this.b = 101;
		super.a = 200;
		super.b = 201;
		// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法
		methodA(); // 没有传参,访问父类中的methodA()
		methodA(20); // 传递int参数,访问子类中的methodA(int)
		// 如果在子类中要访问重写的父类方法,则需要借助super关键字
		methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),父类的无法访问到
		super.methodB(); // 访问父类的methodB()
	}
}

注意:

1.只能在非静态方法中使用super。
2.在子类方法中,访问父类的成员变量和方法。

子类构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。

// Base.java
public class Base {
	public Base(){
		System.out.println("Base()");
	}
}
// Derived.java
public class Derived extends Base{
	public Derived(){
		// super(); // 注意子类构造方法中默认会调用父类的无参构造方	法:super(),
		// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,并且只能出现一次
		System.out.println("Derived()");
	}
}
// Test.java
public class Test {
	public static void main(String[] args) {
		Derived d = new Derived();
	}
}
/*
* 运行的结果为:
* Base()
* Derived()
*/

在子类构造方法中,并没有写任何关于父类构造的代码,但是在构造子类对象时,先执行父类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,父类继承下来的以及子类新增加的部分。在构造子类对象时候 ,先要调用父类的构造方法,将从父类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整

注意:

1.若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法。
2.如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3.在子类构造方法中,super(…)调用父类构造时,必须是子类构造中第一条语句。
4.super(…)只能在子类构造方法中出现一次,并且不能和this同时出现。

super和this

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

相同点:

  • 都是Java中的关键字。
  • 只能在类的非静态方法中使用,用来访问非静态成员方法和字段。
  • 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在。

不同点:

  • this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用。
  • 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性。
  • 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现。
  • 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有。

继承方式

在Java中只支持以下几种继承方式:
在这里插入图片描述

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

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

相关文章

分代收集 + 垃圾回收算法

分代假说 1. 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的 2. 强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消亡 3. 跨代引用假说&…

网工软考 | 软考改机考,解读你最关心的5个问题

2023年下半年软考改为机考后,后台收到了很多的留言,大家对于实行机考的疑问还是有很多,例如要不要画图,用的什么输入法,报名费会不会涨价等。 今天就给大家解答一波。 01 软考改机考FAQ Q:软考机考会不会随…

华为内部,提拔项目经理的等级依据

大家好,我是老原。 最近和朋友吃饭,都在聊项目化,企业转型…… 要知道,一件事一旦到了饭桌上成了谈资,就说明它的趋势已经形成了。 这同时也表示,市场对项目经理的要求更高了。 早在2009年的高端项目经…

【eNSP】交换机(vlan和vlan间通信)

【eNSP】交换机(vlan和vlan间通信) 原理术语过程 实验根据图片连接模块配置设备名称和IP地址配置交换机交换机链路指定sw1配置sw2配置 设置网关交换机互联实验设置查看设置结果 ospf配置 原理 HUB集线器:它的作用可以简单的理解为将一些机器…

信捷 XDH Ethercat 高速计数器计数准确性

本人在X0,X1连手轮(手轮刻度100),CNT_AB指令使用高速计数器HSC0,出现了计数值不对。 转1圈应该有计数值变化400,实际变化只有50左右,有时多于50,有时少于50。 检查发现SFD320等于4,是正确的,百般不得其解…

AI 与智能化 API 治理的探索实践

7月 Eolink 受邀参加 QECon 2023 全球软件质量&效能大会(北京站)。Eolink CEO 刘昊臻,发表了主题为**「AI 与智能化 API 治理的探索实践」**的演讲,分享 Eolink 在 API 全生命周期中治理实践与 AI 结合的探索。 Eolink 作为国…

String trim方法,使用前需要判空

背景是接口导入时,部分字段因为手动录入可能误输空格,所以需去掉前后空格,这些属性为非必填,所以未校验非空,引发空指针异常。 代码类似这样,未判断是否为空,直接trim,导致空指针异常 Testpubl…

【JVM】运行时数据区——自问自答

Q:Java 运行时数据区解构,哪些数据线程独占,哪些是线程共享?每个区域会产生GC和异常吗? 运行时数据区: 1、PC寄存器 2、堆区 3、JVM栈 4、Native栈 5、方法区 其中,PC寄存器、Native栈、JVM栈是线程独占的…

【Spring专题】Spring之Bean生命周期源码解析——阶段四(Bean销毁)(拓展,了解就好)

目录 前言阅读建议 课程内容一、Bean什么时候销毁二、实现自定义的Bean销毁逻辑2.1 实现DisposableBean或者AutoCloseable接口2.2 使用PreDestroy注解2.3 其他方式(手动指定销毁方法名字) 三、注册销毁Bean过程及方法详解3.1 AbstractBeanFactory#requir…

python列表笔记,python列表用法及基础操作

列表的介绍 定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗? 答: 列表 一、列表的格式 定义列的格式:[元素1, 元素2, 元素3, ..., 元素n] 变量tmp的类型为列表 tmp [xiaoWang,180, 65.0] 列…

数模论文写作细节要求

目录 优秀论文必要条件 数学建模的基本思路 第一步:了解问题——查文献、找数据 第二步:阐述要解决什么问题、用什么方法 其余步骤:给出数学模型、计算求解、对比结果与真实情况、应用于现实问题。 使用某种数学方法的理由和依据 创…

【SAP-MDG】MDG配置-配置工作流任务 Configure Workflow Tasks

一、配置工作流任务的前提: 1.工作流能启动的常规设置已设置完毕;(前面提到的内容) 2.配置目录:SPRO→SAP NetWeaver→Application Server→Business Management→SAP Business Workflow.(SPRO→SAP NetW…

Splashtop:适合旅行办公人士的远程工作解决方案

无论是重要的商务旅行,还是旅游度假,还是数字游牧生活方式的诱惑,许多人都会发现自己在机场贵宾室制作演示文稿,在古雅的咖啡馆参加虚拟会议,或者在偏远海滩的宁静背景下集思广益。 随处远程办公的生活让人向往。尽管…

5G科技防汛,助力守护一方平安

“立秋虽已至,炎夏尚还在”,受台风席卷以及季节性影响全国多地正面临强降水的严峻挑战。“落雨又顺秋,绵绵雨不休”,正值“七下八上” 防汛关键时期,贵州省水文水资源局已全面进入备战状态。 为确保及时响应做好防汛抢…

Linux SIGCHLD信号

在子进程结束之后,会默认给父进程发送SIGCHLD信号。 有以下代码: 编译并运行以上代码: 可以看到在子进程结束之后,将SIGCHLD信号发送给了父进程,然后输出SIGCHLD信号的代号17。 在后台运行以上代码并查看进程信息&am…

IDEAdebug调试时查看时间戳和Date类型的对象,格式化为yyyy-mm-hh

平时debug时遇到Date或者时间戳时看时间不好判断到底是几月几号,希望直接格式化为想要的格式 比如 下面,Date直接显示为 yyyy-mm-hh的格式 解决方案: 无需下载插件,如图 //Date格式化 return new SimpleDateFormat("…

SIP网络音频模块SV-2401V网络对讲音频模块(支持POE)

功能和特点 音频工作方式: 音频解码:即音频播放。接收来自网络的音频流,经过模块解码后通过线路输出高质量音频信号。目前支持可以播放以下音频格式:MP3、WAV (PCM IMA ADPCM)、G.711、G.722等,可以播放最高48k采样率…

汽车租赁管理系统/汽车租赁网站的设计与实现

摘 要 租赁汽车走进社区,走进生活,成为当今生活中不可缺少的一部分。随着汽车租赁业的发展,加强管理和规范管理司促进汽车租赁业健康发展的重要推动力。汽车租赁业为道路运输车辆一种新的融资服务形式、广大人民群众一种新的出行消费方式和…

每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)

今日份题目: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…

全网最全的IntelliJ IDEA中快捷键大全,JetBrains公司IDE工具Windows快捷键大全,idea、pycharm快捷键大全

文章目录 前言零、工具的优点0.1快速修复0.2代码自动补全0.3实时模板0.4显示历史版本0.5调试功能 一、Ctrl二、Alt三、Shift四、Ctrl Alt五、Ctrl Shift六、Alt Shift七、Ctrl Shift Alt八、其它 前言 工欲善其事必先利其器,JetBrains公司IDE工具为我们的开发…