Java SE(8)——继承

1.继承的概念&作用

在Java中,继承是面向对象编程的三大基本特性之一(还有封装多态),允许一个类(子类/继承类)继承另一个类(父类/基类)的属性方法

继承的核心目的是:

  • 1.子类能够在不改变父类原有特性的基础上进行扩展
  • 2.实现代码的复用和建立类之间的层次关系

在我们现有的知识储备基础上,如果要抽象出,代码就要这么些:
在这里插入图片描述
但我们不难发现,在上述抽象狗和猫的过程中,有部分代码是重合的。这是因为狗和猫同属于动物,都有名字、毛色和年龄,都会睡觉。那么我可以定义一个Animal类来对这些相同的代码(共性)进行抽取,然后让Dog和Cat类来继承Animal类中的属性
在这里插入图片描述

2.继承的语法格式

要实现类之间的继承关系,需要借助extends关键字

修饰符 class 子类类名 extends 父类类名{
//其他代码
}

在这里插入图片描述
注意:

  • 1.父类中的所有成员变量和方法都会被子类继承(即使是private修饰的成员也会被继承)
  • 2.子类在继承父类原有是特性的基础上,必须要添加属于自己的特性(对父类做出扩展),否则没有继承的必要

3.如何访问父类中的成员

3.1 访问父类中的成员变量

3.1.1 当父类和子类不存在同名变量时

在这里插入图片描述
使用this关键字就能访问子类对象中的所有变量
在这里插入图片描述

3.1.2 当父类和子类存在同名变量时

在这里插入图片描述
在这里插入图片描述
注意:

  • 1.当在子类对象内部访问成员变量时,优先访问自己的成员变量
  • 2.如果自己没有,就从父类继承的成员变量中查找;如果父类中也没有,就报错
  • 3.当父类和子类中存在同名变量时,优先访问子类自己的

如何访问父类中的同名变量?
下面讲到super关键字再说

3.2 访问父类中的成员方法

当访问父类和子类中的不同名方法时:
在这里插入图片描述

  • 1.优先访问子类自己的方法
  • 2.如果子类没有该方法,从父类中查找;如果父类也没有,报错

当访问父类和子类中的同名方法时:
在这里插入图片描述

  • 3.如果父类和子类的同名方法构成重载,按照调用调用方法时传递的参数列表进行匹配

如果父类和子类的方法不仅方法名一样,参数列表也一样呢?
此时父类和子类的方法之间构成了重写重写的方法也可以通过super关键字来访问。至于重写是什么?以及它们之间的调用关系等到讲多态的时候再介绍

4.super关键字

4.1 使用super访问父类的成员

在Java中,super关键字用于在子类中引用其父类的成员。以上面的dog对象为例,super的访问范围如下:在这里插入图片描述
所以在父类和子类中出现同名成员变量时,如果想要访问父类的同名变量就需要借助super关键字
在这里插入图片描述
如果想要访问父类和子类中方法名一样,参数列表也一样的成员方法时,也可以借助super关键字
在这里插入图片描述

4.2 super&this的共性和区别①

共性:

  • 1.都属于Java中的关键字
  • 2.都只能在非静态方法中访问非静态的方法和变量

区别:

  • 1.this表示当前对象的引用,当前对象就是调用实例方法的对象;super是指向 当前对象中父类继承的成员方法和变量引用
  • 2.从访问范围来看,this可以访问当前对象中的多有成员,但是super只能访问当前对象中从父类继承的成员 在这里插入图片描述

5.构造方法&初始化顺序

5.1 父类和子类的构造关系和执行顺序

当创建一个子类对象时,Java会先调用父类的构造方法对父类的成员变量进行初始化,在父类初始化完毕后再调用子类的构造方法对子类的成员变量进行初始化(先有父再有子)。而在子类的构造方法中调用父类的构造方法也需要借助super关键字
在这里插入图片描述
即使调用父类的无参构造方法,在子类的构造方法中也必须要显式地写出super
在这里插入图片描述

  • super语句必须放在构造方法中的第一行

5.2 super&this的区别②

  • 1.在构造方法中,this(…)用于调用本类构造方法,super(…)用于调用父类构造方法。this(…)和super(…)都必须放在构造方法中的第一句,所以在构造方法中this(…)和super(…)不能同时存在
  • 2.在子类构造方法中一定存在super(…)的调用(因为父类会默认生成无参构造方法),但是this(…)用户不写就没有

5.3 初始化顺序

在上篇JavaSE(7)——类和对象(二)中介绍了三种代码块的作用和执行顺序。

  • 1.实例代码块一般用于初始化实例成员变量,静态代码块一般用于初始化静态成员变量
  • 2.静态代码块最先执行且在整个类的声明周期中只会执行一次;实例代码块比构造方法先执行,每实例化一个对象都会执行实例代码块

当对象之间引入了继承关系时,父类和子类的代码块和构造方法的执行顺序是怎么的呢?

public class Father {//public Father(){System.out.println("父类的无参构造方法");}//{System.out.println("父类的实例代码块");}//static {System.out.println("父类的静态代码块");}
}
public class Son extends Father {//public Son(){super();System.out.println("子类的无参构造方法");}//{System.out.println("子类的实例代码块");}//static {System.out.println("子类的静态代码块");}
}
public class Test {//public static void main(String[] args) {Son son = new Son();}
}

执行结果:
父类的静态代码块
子类的静态代码块
父类的实例代码块
父类的无参构造方法
子类的实例代码块
子类的无参构造方法

6. 访问限定修饰符——protected(受保护的)

被声明为protected的成员变量/方法,可以被同一个包中的任意类访问,也可以被其他包中的子类访问
在这里插入图片描述

注意一:protected成员的访问权限是基于类层级结构(继承)和包结构的,而不是对象的引用在这里插入图片描述
要想访问父类的protected成员只能在子类内部,无法在外部包的非子类中通过子类的引用来访问

注意二:在子类中,只能通过子类自己的引用来访问父类的protected成员无法在子类中通过其他子类的引用来访问父类的protected成员
在这里插入图片描述

6.final关键字

在Java中,final关键字主要用于限制类、方法和变量的可变性可继承性

6.1 final修饰类

表示该类不能被继承
在这里插入图片描述

6.2 final修饰成员方法

表示该方法不能被重写
在这里插入图片描述
重写的概念下篇博文再介绍

6.3 final修饰变量

final修饰成员变量:定义成员变量的同时必须进行初始化

final修饰局部变量:

  • 1.定义局部变量的同时进行初始化,之后无法修改该变量的值
    -2.定义局部变量时未初始化,在第一次初始化之后,无法再修改该变量的值

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

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

相关文章

Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)

目录 引言一、背景:为什么代理IP是爬虫的“第二生命”?1.1 反爬系统的IP检测三把刀1.2 代理IP的核心价值 二、基础实战:快速搭建代理IP系统2.1 免费代理IP的获取与筛选2.2 代理IP的智能容错机制 三、高阶攻防:突破企业级反爬封锁3…

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…

ByteArrayInputStream 类详解

ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流,位于 java.io 包。它允许将内存中的字节数组当作输入流来读取,是处理内存数据的常用工具。 1. 核心特性 内存数据源:从字节数组(b…

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据,令是序列的第i个元素,那么就是一个长度为的序列,NLP中最常见的元素是单词,对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时,为了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib库,支持多种哈希算法,比如MD5、SHA1、SHA256等。通常SHA256比较安全,但MD5更快,但可能存在碰撞风险,得根据自己需求决定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea创建springboot项目无法创建jdk8原因及多种解决方案

idea创建springboot项目无法创建jdk8原因及多种解决方案 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&#x…

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁,传父类调用父类,传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…

面向网络安全的开源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…

Python爬虫的基础用法

Python爬虫的基础用法 python爬虫一般通过第三方库进行完成 导入第三方库(如import requests ) requests用于处理http协议请求的第三方库,用python解释器中查看是否有这个库,没有点击安装获取网站url(url一定要解析正确&#xf…

WHAT - Tailwind CSS + Antd = MetisUI组件库

文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们介绍了 Tailwind,至于 Antd 组件库,我们应该都耳熟能详,官网地址:htt…

Day 4:牛客周赛Round 91

好久没写了,问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数,用质因数分解;奇数因子只需要去掉质数为2的情况,用除法。 这里有个比较妙的细节是,提前处理出数字x的最小质因数&#xff0…

使用直觉理解不等式

问题是这个: 题目 探究 ∣ max ⁡ b { q 1 ( z , b ) } − max ⁡ b { q 2 ( z , b ) } ∣ ≤ max ⁡ b ∣ q 1 ( z , b ) − q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb​{q1​(z,b)}−maxb​{q2​(z,b)}∣≤…

恶心的win11更新DIY 设置win11更新为100年

‌打开注册表编辑器‌:按下Win R键,输入regedit,然后按回车打开注册表编辑器。‌12‌导航到指定路径‌:在注册表编辑器中,依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings‌新建DWORD值‌&…

嵌入式驱动学习

时钟 定义 周期型的0、1信号 时钟信号由“心脏”时钟源产生,通过“动脉”时钟树传播到整个芯片中。 SYSCLK系统时钟,由HSI、HSE、PLLCLK三选一。 HCLK是AHB总线时钟, PCLK是APB总线时钟。 使用某个外设,必须要先使能该外设时钟系统…

Java:从入门到精通,你的编程之旅

Java,一门历久弥新的编程语言,自诞生以来就以其跨平台性、面向对象、稳定性和安全性等特性,在企业级应用开发领域占据着举足轻重的地位。无论你是初学者还是经验丰富的开发者,Java 都能为你提供强大的工具和广阔的舞台。 为什么选…

Linux:深入理解数据链路层

实际上一台主机中,报文并没有通过网络层直接发送出去,而是交给了自己的下一层协议——数据链路层!! 一、理解数据链路层 网络层交付给链路层之前,会先做决策再行动(会先查一下路由表,看看目标网…

Python基本语法(类和实例)

类和实例 类和对象是面向对象编程的两个主要方面。类创建一个新类型,而对象是这个 类的实例,类使用class关键字创建。类的域和方法被列在一个缩进块中,一般函数 也可以被叫作方法。 (1)类的变量:甴一个类…

2025 年如何使用 Pycharm、Vscode 进行树莓派 Respberry Pi Pico 编程开发详细教程(更新中)

micropython 概述 micropython 官方网站:https://www.micropython.org/ 安装 Micropython 支持固件 树莓派 Pico 安装 Micropython 支持固件 下载地址:https://www.raspberrypi.com/documentation/microcontrollers/ 选择 MicroPython 下载 RPI_PIC…

flink rocksdb状态说明

文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…