【Java SE】继承

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 继承
    • 1.1 继承是什么
    • 1.2 继承的意义
    • 1.3 继承的语法
    • 1.4 继承的方式
    • 1.5 子类中访问父类成员
      • 1.5.1 子类中访问父类成员变量
      • 1.5.2 子类中访问父类成员方法
    • 1.6 super关键字
    • 1.7 子类构造方法
  • 2. super与this关键字
  • 3. final 关键字
    • 3.1 修饰变量或字段
    • 3.2 修饰类
    • 3.3 修饰方法

1. 继承

面向对象三大特性:封装、继承、多态
今天我们一起来看看继承这一特性~~~

1.1 继承是什么

Java中使用类对现实世界中实体来进行描述,类实例化后的对象来表示现实中的实体,but现实世界错综复杂,事物之间可能会存在一些关联,对于这些有关联的事物,我们需要合理地设计程序。
比如:狗和猫,它们都是动物,我们可以用Java来描述狗和猫的属性和方法,如下:

public class Dog {int legNumber;String name;String gender;int age;float weight;void eat() {System.out.println(name+"在吃饭");}void sleep() {System.out.println(name+"在睡觉");}void bark() {System.out.println(name+"汪汪叫");}
}public class Cat {int legNumber;String name;String gender;int age;float weight;void eat() {System.out.println(name+"在吃饭");}void sleep() {System.out.println(name+"在睡觉");}void meow() {System.out.println(name+"喵喵叫");}
}

从上述代码中,我们直观清晰看到,狗和猫类中存在大量重复,它们的属性都有腿的数量、名字、性别、年龄、体重和吃饭这个行为,它们的叫声不同。显然,这个代码存在大量重复,是不合理的。
解决办法:面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用
继承
继承是面向对象最显著的一个特性,继承是从已有的类(父类)派生出新的类(子类),新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
在上述狗和猫的场景中,我们将狗和猫的共性抽取,它们都是动物,很多属性都有共性,我们将这些共性抽取出来,而狗和猫又各自有属于自己的属性,利用继承的思想达到代码共用的思想,动物类则是父类,狗和猫是子类,子类可以复用父类中成员子类在实现时只需关心自己新增加的成员
在这里插入图片描述

1.2 继承的意义

继承有什么意义呢?
继承的意义在于对共性抽取,实现代码复用,是多态性的基础,子类能够更灵活地适应不同的需求,提高代码的通用性和可扩展性,并层次化分类,使程序结构更易于管理。

1.3 继承的语法

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

class 父类名称 {
// 父类的属性和方法
}
修饰符 class 子类名称 extends 父类名称 {
// 子类特有的属性和方法
// 子类可以覆盖父类的方法
}

通过上述的分析,使用继承的思想重新设计,各部分代码如下:

public class Animal {int legNumber;String name;String gender;int age;float weight;void eat() {System.out.println(name+"在吃饭");}void sleep() {System.out.println(name+"在睡觉");}
}
public class Dog extends Animal{void bark() {System.out.println(name+"汪汪叫");}
}
public class Cat extends Animal {void meow() {System.out.println(name+"喵喵叫");}
}
public class Test {public static void main(String[] args) {Dog dog = new Dog();Cat cat = new Cat();dog.name = "球球";cat.name = "毛毛";dog.bark();cat.meow();}
}

【注意事项】
1)一个.java文件写一个类,如下写法:
在这里插入图片描述
2)Dog类和Cat并没有定义成员变量,name是从父类Animal继承过来的,eat()和sleep()方法也是继承来的,即子类会将父类中的成员变量或者成员方法继承到子类中
3) 子类继承父类后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承,完全可以直接用父类呀~所以,必须要新添加自己特有的成员

1.4 继承的方式

在现实世界中,事物之间的关系是十分复杂的~那Java支持哪些继承方式呢!
在这里插入图片描述
Java支持单继承、多层继承、不同类继承同一类
不支持多继承(一个子类继承多个父类,不支持)!!!
在这里插入图片描述
Java中不支持多继承
尽管在写代码时候,我们可能会碰到类之间有非常复杂的关系,但是仍然不希望类之间的继承关系超过三层, 继承层次太多, 需要考虑对代码进行重构
如果想从语法上进行限制继承,使用 final 关键字修饰类,表示该类不可以被继承

1.5 子类中访问父类成员

1.5.1 子类中访问父类成员变量

【子类和父类不存在同名成员变量】

public class Parent {String a;String b;
}
public class Child extends Parent{String c;public void method() {a = "我是父类的a";b = "我是父类的b";c = "我是子类特有的c";System.out.println(a);System.out.println(b);System.out.println(c);}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.method();}
}

运行结果如图:
在这里插入图片描述
解释:子类中没有a和b变量,a、b访问从父类Parent类继承下来的a、b,子类中有变量c,c是访问子类自己的c
【子类和父类存在同名成员变量】

public class Parent {String a;String b;String c;
}
public class Child extends Parent{String a;char b;public void method() {a = "我是子类Child类中的a";b = 'b';c = "我是父类Parent类中的c";System.out.println(a);System.out.println(b);System.out.println(c);}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.method();}
}

运行结果如图:
在这里插入图片描述
解释:子类中有变量a则访问的是自己的a,而变量b在父类与子类中均有,类型不同,可以看到,优先访问的是子类中的变量b,子类中没有变量c则访问从父类继承下来的c
总结
通过子类对象或者在子类方法中访问成员时,以下3种情况:
(1) 访问的成员变量子类中有,优先访问自己的成员变量
(2) 访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错
(3) 访问的成员变量与父类中成员变量同名,则优先访问自己的
即成员变量访问遵循就近原则,自己有则优先访问自己的,否则在父类中寻找

1.5.2 子类中访问父类成员方法

【子类和父类不存在同名成员方法】

public class Parent {public void methodA() {System.out.print("父类Parent类中的methodA()方法!");}
}
public class Child extends Parent{public void methodB() {System.out.print("子类Child类中的methodB()方法!");}public void methodC() {methodA();methodB();}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.methodC();}
}

运行结果如图:
在这里插入图片描述
解释:子类中没有methodA()方法,子类访问父类Parent类继承下来的methodA()方法,methodB()方法是访问子类自己的methodB()方法
【子类和父类存在同名成员方法】

public class Child extends Parent{public void methodA(int a) {System.out.println("Child子类中的methodA(int)方法");}public void methodB() {System.out.println("子类Child类中的methodB()方法!");}public void methodC() {methodA();methodA(12);methodB();}
}
public class Parent {public void methodA() {System.out.println("父类Parent类中的methodA()方法!");}public void methodB() {System.out.println("父类Parent类中的methodB()方法!");}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.methodC();}
}

运行结果如图:
在这里插入图片描述
解释:子类中的methodA()和父类中的methodA()构成重载,根据调用方法,调用哪个就是哪个,methodA()未传参,调用父类的,methodA(12)传参了,调用子类Child的methodA(12)方法。methodB同名,调用子类自己的methodB()方法
总结
(1) 子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问父类的,否则编译报错
(2) 子类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果参数列表一致,优先在子类中找访问自己的
即成员方法访问遵循就近原则,自己有则优先访问自己的,否则在父类中寻找,如果方法重载,根据调用方法选择一致的

1.6 super关键字

我们知道,如果子类自己有变量c,那么优先访问子类的c,如果我想访问父类的c,该如何做捏!
在这里插入图片描述
此时super关键字,闪亮登场!!!
Java提供super关键字,该关键字主要作用就是在子类方法中访问父类的成员

public class Parent {String a  = "我是父类Parent类中的a";String b  = "我是父类Parent类中的b";String c;public void methodA() {System.out.println("我是父类Parent类中的methodA()");}
}
public class Child extends Parent{String a = "我是子类Child类中的a";char b;public void methodA() {System.out.println("我是子类Child类中的methodA()");}public void method() {System.out.println(a);//a相当于this.aSystem.out.println(super.a);methodA();//methodA()相当于this.methodA()super.methodA();}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.method();}
}

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

优先访问子类中的成员,无法访问到父类中的成员,通过关键字super可以访问到父类的成员变量和方法
注意事项
(1) 只能在非静态方法中使用
(2) 在子类方法中,访问父类的成员变量和方法

1.7 子类构造方法

父子,即先有父再有子,在子类构造方法内,必须先帮助父类构造
在子类构造方法中,虽然并没有写任何关于父类的构造的代码,通过代码运行结果得知,在构造子类对象时,先执行父类的构造方法,后执行子类的构造方法

public class Parent {public Parent() {System.out.println("父类Parent构造方法");}
}
public class Child extends Parent{public Child() {
//super(); 被隐藏了 
//子类构造方法中默认会调用父类的无参构造方法super()
//没有写时,编译器会自动添加,且super()必须是子类构造方法中第一条语句,
//且只能出现一次System.out.println("子类Child构造方法");}
}
public class Test {public static void main(String[] args) {Child child = new Child();}
}

运行结果如下:
在这里插入图片描述
原因】子类对象中成员由两部分组成,父类继承下来的+子类新增加的部分,先有父再有子,所以在构造子类对象时候 ,先要调用父类的构造方法,将从父类继承下来的成员构造完整,再调用子类自己的构造方法,将子类自己新增加的成员初始化完整
在这里插入图片描述

注意事项
(1) 父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法

public Parent() {
}public Child() {super(); 
}

(2) 父类构造方法是带有参数的,此时需要为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败,即子类必须先帮助父类构造

public class Parent {String name;int age;public Parent(String name, int age) {this.name = name;this.age = age;}
}
public class Child extends Parent{int index;public Child(String name, int age,int index) {super(name,age); //必须先帮助父类构造且super为第一条语句,交换顺序则会报错,且super只出现一次!this.index = index;}
}

(3) 在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句,且只能出现一次并且不能和this同时出现!!!即this和super调用构造器不能同时出现

public class Child extends Parent{int index;public Child(String name, int age,int index) {super(name,age);this("1",2,4);//将会报错!!不能同时出现}
}

2. super与this关键字

相同点
(1) 均为Java中的关键字
(2) 均只能在类的非静态方法中使用,用来访问非静态成员方法和变量
(3) 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
不同点
(1) this是当前对象的引用,当前对象即调用实例方法的对象,super是子类对象中从父类继承下来部分成
员的引用

(2) 在非静态成员方法中,this访问本类的方法和属性super访问父类继承下来的方法和属性
(3) 在构造方法中:this(…)调用本类构造方法super(…)调用父类构造方法,两种调用不能同时在构造方法中出现
(4) 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有

3. final 关键字

final关键字可以用来修饰变量、成员方法以及类

3.1 修饰变量或字段

表示该变量不能被修改(即常量)

final int a = 100;
a = 20;
//编译出错,变量a被final修饰,不能被修改

3.2 修饰类

表示该类不能被继承

final public class Animal {...
}public class Cat extends Animal{...
}
//编译出错,Animal类被final关键字修饰,表示不能被继承

3.3 修饰方法

表示该方法不能被重写

本期内容到这里结束啦~以下为本期内容回顾!
在这里插入图片描述下期再见啦~

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

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

相关文章

js类型转换

类型转换只有这四种,例如如果要对象转数字,那么就需要先把对象转成原始类型,再从原始类型转到数字。 空数组转原始类型是一个空字符串。空对象转原始类型是[object Object]。 let a {} console.log(a);// NaN //等价于 a->原始 然后原始…

北京大学创新推出ManipLLM黑科技 | 大幅提升机器人操作的鲁棒性与智能性

机器人操作依赖于准确预测接触点和执行器方向以确保成功操作。然而,基于学习的机器人操作,在模拟器中仅针对有限类别进行训练,往往难以实现泛化,特别是在面临大量类别时。 因此,作者提出了一种创新的方法,…

网络安全基础之网络协议与安全威胁

OSI(OpenSystem Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。 网络协议的简介: 定义:协议是网络中计算机或设备之间进行通信的一系列规则集合。 什么是规则?…

Android操作sqlite数据库

Sqlite数一种轻量级的关系型数据库,android里面可以用来持久化存储一些用户数据。 一、SQLiteOpenHelper方式 SQLiteOpenHelper是原生的数据库帮助类,继承这个类,用来创建,更新数据库的操作 public class MySqliteOpenHelper e…

算法整理:链表

链表定义 struct ListNode { int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {} }; 链表的遍历:ListNode phead; while(p!null) pp.next; 找到链表的尾结点:phead; while(p.next!null)pp.next; 链表节点的个数: phead…

蓝桥杯真题:七段码

import java.util.Scanner; import java.util.ArrayList; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args){// 连接关系图int[][] map new int[][]{{0, 1, 0, 0, 0, 1, 0},{1, 0, 1, 0, 0, 0, 1},{0, 1, 0, 1, 0, 0…

通讯录项目实现

引言:通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人: 删除联系人&#xf…

c++的学习之路:10、string(2)

本章主要说一下模拟实现string类的部分功能,文章末附上所有代码。 目录 一、构造函数与析构函数 二、拷贝构造 三、c_str 四、【】和迭代器的遍历与访问 五、size 六、判断 七、reserve 八、push_back 九、resize 十、append 十一、 十二、insert 十…

Redis的5大常见数据类型的用法

上一篇文章我们讲了Redis的10大应用场景,这一篇文章就针对Redis的常用数据结构进行一个说明,通过示例的形式演示每一种数据结构如何使用。 当涉及Redis的数据操作时,不同数据类型对应的不同数据结构,如下就对5大常用的数据类型进行…

Transformer,革命性的深度学习架构

Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神…

2024最新版Android studio安装入门教程(非常详细)

目录 JDK安装与配置 一、下载JDK 二、JDK安装 三、JDK的环境配置 四、JDK的配置验证 Android studio安装 Android studio连接手机真机调试(以华为鸿蒙为例) 一、新建一个android项目 二、进入项目面板 三、配置Android Studio 四、安装手机驱…

【linux】进程替换的应用|shell解释器的实现

当我们学过了进程替换之后,本篇文章可以根据进程替换的知识带你自主实现一个shell命令行 实现步骤 1.显示命令行提示 2.读取输入指令以及对应选项 3.分割第二步的指令以及选项到命令行参数表中 4.处理内建命令 5.进程替换 1.显示命令行提示 我们通过观察bash的命令行…

Linux 文件相关命令

一、查看文件命令 1)浏览文件less 默认查看文件的前 10 行。 less /etc/services ##功能说明: #1.默认打开首屏内容 #2.按【回车】按行访问 #3.按【空格】按屏访问 #4.【从上向下】搜索用/111,搜索包含111的内容,此时按n继续向下搜&#x…

JAVAEE之IoCDI

Spring 是⼀个 IoC(控制反转)容器,作为容器, 那么它就具备两个最基础的功能: • 存 • 取 Spring 容器管理的主要是对象, 这些对象, 我们称之为"Bean". 我们把这些对象交由Spring管理, 由 Spring来负责对象的创建…

想学网络安全,从哪里开始?网络安全的学习路线

网络安全学习路线: 想学习网络安全专业的知识,想当黑客,但是不知道该从哪里开始学。 我给你一个路线! 清晰图片和大纲:https://docs.qq.com/doc/DU1lpVFpSbWVrd2p3

面试官:为什么忘记密码要重置,而不是告诉我原密码?

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 最近有个同学在面试中遇到了一个很有意思的问题,我相信大多…

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接: 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解: 蓝桥杯真题讲解:异或和之和 (拆位、贡献法)-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…

【T5中的激活函数】GLU Variants Improve Transformer

【mT5中的激活函数】GLU Variants Improve Transformer 论文信息 阅读评价 Abstract Introduction Gated Linear Units (GLU) and Variants Experiments on Text-to-Text Transfer Transformer (T5) Conclusion 论文信息 名称内容论文标题GLU Variants Improve Transfo…

flutter获取手机中的系统路径信息

https://www.bilibili.com/video/BV1wE421g7sw获取系统中的路径 获取系统中的路径,并在这个路径中创建一个文本文件【str.txt】 然后进行写入【str.txt】 再读取这个文件【str.txt】 手机没有开通root权限无法看到写入到【应用程序文档目录】路径中的文件 用来…

MySQL故障排查与优化

一、MySQL故障排查 1.1 故障现象与解决方法 1.1.1 故障1 1.1.2 故障2 1.1.3 故障3 1.1.4 故障4 1.1.5 故障5 1.1.6 故障6 1.1.7 故障7​ 1.1.8 故障8 1.1.9 MySQL 主从故障排查 二、MySQL优化 2.1 硬件方面 2.2 查询优化 一、MySQL故障排查 1.1 故障现象与解决方…