Java继承简介

继承的本质:是代码的复用,重复使用已经定义好的方法和域(即全局变量)

要掌握继承首先要了解Java方法的重载和重写

方法的重载和重写

方法的重载

当前方法名相同,但是参数类型不同,发生重载

类比数学函数公式

重载发生在同一个类当中

方法的重写

发生在类的继承中, 子类重写父类的方法

方法名和参数列表必须相同

构造器就是典型的方法的重载

重写的特点:

子类优先调用自己重写后的方法,如果没有,向上寻找

继承中类的加载顺序

static代码块:在main方法执行之前执行,且执行一次。

先执行父类static,再执行子类static:创建子类对象之前,先创建父类对象

扫描加载----------->执行

加载的时候,一定先把父类加载到虚拟机。加载的时候注意父类和接口。先加载父类再加载子类,防止子类调用父类方法或域时无法找到

创建子类对象之前,一定先创建了父类对象

对象初始化顺序:

方法不调用不执行

方法块可以直接执行

方法块的优先级高于构造方法

方法块和属性谁在上面谁先执行

静态方法的属性或代码块优先级高于其他,同级别之间顺序按先后执行

静态优先级最高,且只初始化一次,即只执行一次

class Demo_1{
// 下面代码执行顺序: c --> 代码块1 --> a --> 代码块2 --> b --> 构造方法public Demo_1(){System.out.println("俺是构造方法:"+a);}public int a=10;{System.out.println("俺是代码块1:"+a);    }public int b =20;{System.out.println("俺是代码块2");    }public static int  c =90;public static Demo_1 s = new Demo_1();static{System.out.println("俺是静态代码块3");    }
}
// 产生多少个对象,非静态的代码块就执行多少次
// 但静态的只执行一次
public class Demo_1_Test{public static void main(String[] args){// main 方法中只有4个对象//Demo_1类中的static对象 s 只执行一次Demo_1 x1 = new Demo_1();Demo_1 x2 = new Demo_1();Demo_1 x3 = new Demo_1();}
}

以上代码运行结果:

俺是代码块1:10
俺是代码块2
俺是构造方法:10
俺是静态代码块3
俺是代码块1:10
俺是代码块2
俺是构造方法:10
俺是代码块1:10
俺是代码块2
俺是构造方法:10
俺是代码块1:10
俺是代码块2
俺是构造方法:10

静态的执行时间是类的首次使用时,是第一个对象产生的时候触发的,且仅由类的第一个对象触发——即静态的初始化是在第一个对象产生的时候触发的,且仅由类的第一个对象触发

子类对象产生时,一定会产生一个父类对象

父类对象一定优先于子类对象产生,父类的初始化一定优先于子类

父类静态 --> 子类静态 --> 父类非静态 --> 父类构造方法 --> 子类非静态 --> 子类构造方法。静态和非静态属性和代码块都有,按先后顺序初始化。

class Demo_1{public Demo_1(){System.out.println("俺是Demo_1构造方法");}{System.out.println("俺是代码块Demo_1");    }static{System.out.println("俺是静态代码块Demo_1");    }
}
// 子类对象产生时,一定会产生一个父类对象
// 父类对象一定优先于子类对象产生
class Demo_2 extends Demo_1{public Demo_2(){System.out.println("俺是Demo_2构造方法");}{System.out.println("俺是代码块Demo_2");    }static{System.out.println("俺是静态代码块Demo_2");    }
}public class Demo_1_Test{public static void main(String[] args){Demo_1 x1 = new Demo_1();Demo_2 x2 = new Demo_2();}
}

 上述代码执行结果:

俺是静态代码块Demo_1
俺是代码块Demo_1
俺是Demo_1构造方法
俺是静态代码块Demo_2
俺是代码块Demo_1
俺是Demo_1构造方法
俺是代码块Demo_2
俺是Demo_2构造方法

从内存的角度来理解,什么是方法的重写

子类重写了父类的方法,在子类调用该方法时,父类的该方法失效。

// AAA.java
package 继承;public class AAA {public void testA() {System.out.println("该方法当中有很多逻辑运算----》AAA");}public  AAA(String name) {System.out.println(name+",俺是AAA的构造函数!");}}
// BBB.java
package 继承;public class BBB extends AAA {public void name() {//调用父类的方法super.testA();   }public void run() {testA();}public void run(String name) {}public void testA() {System.out.println("该方法当中有很多逻辑运算----》BBB");}public BBB(String name) {super(name);System.out.println(name+",俺是BBB的构造函数!");}
}
// Test.java
package 继承;public class Test{public static void main(String[] args) {BBB bbb= new BBB("你好");bbb.testA();}
}

对上面的继承关系,main方法作为程序入口,开始执行程序。

new关键字创建了一个类BBB,而类BBB继承了类AAA,程序先将类AAA复制一份代码进入堆区,此内存区域内包括testA()方法,bbb指向的内存空间中,还包括BBB类的方法。内存示意图如下

在类AAA中添加方法testB()但在类BBB中未添加重写的方法,bbb也可以直接调用testB()方法。

public class AAA {// 其他方法public void testB() {System.out.println("该方法当中有很多BBB逻辑运算----》AAA");}}
package 继承;public class Test{public static void main(String[] args) {BBB bbb= new BBB("你好");bbb.testA();bbb.testB();}
}

bbb调用testB()会先在类BBB中寻找方法,没有此方法向上级类中继续寻找,如果直接父类中没有定义该方法,则继续向上寻找。等价于在类BBB中重写方法testB(),方法体中只有super.testB()。

但是final修饰的方法不可被重写。

super关键字

了解即可

本质两个用途:调用父类的普通方法;调用父类的构造器

调用父类的普通方法时,可以不使用super

调用父类构造器时只能在子类构造器中使用,并且必须写在子类构造器的第一行

Java的继承层次

Java只有单继承:即一个子类只能有一个父类,一个父类可以有多个子类

总结

1、重载发生在类内,重写发生在有继承关系的不同类中

2、子类对象创建之前先创建父类对象

3、程序初始化顺序:先父类再子类,先静态再非静态,构造方法在最后

注意:初始化顺序和执行顺序不一样,初始化指程序进入内存的顺序。

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

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

相关文章

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践,按重要程度分层说明: 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析: 是否需要排序?: zset(有序集合)用…

Unity抖音云启动测试:如何用cmd命令行启动exe

相关资料:弹幕云启动(原“玩法云启动能力”)_直播小玩法_抖音开放平台 1,操作方法 在做云启动的时候,接完发现需要命令行模拟云环境测试启动,所以研究了下。 首先进入cmd命令,CD进入对应包的文件…

Android studio怎么创建assets目录

在Android Studio中创建assets文件夹是一个简单的步骤,通常用于存储不需要编译的资源文件,如文本文件、图片、音频等 main文件夹,邮件new->folder-assets folder

第26场蓝桥入门赛

5.扑克较量【算法赛】 - 蓝桥云课 C&#xff1a; #include <iostream> #include <algorithm> using namespace std;int a[100005];int main() {int n,k;cin>>n>>k;for (int i1; i<n; i)cin>>a[i], a[i] % k;sort(a1, a1n);int mx a[1]k-a…

公司配置内网穿透方法笔记

一、目的 公司内部有局域网&#xff0c;局域网上有ftp服务器&#xff0c;有windows桌面服务器&#xff1b; 在内网环境下&#xff0c;是可以访问ftp服务器以及用远程桌面登录windows桌面服务器的&#xff1b; 现在想居家办公时&#xff0c;也能访问到公司内网的ftp服务器和win…

c++:list

1.list的使用 1.1构造 1.2迭代器遍历 &#xff08;1&#xff09;迭代器是算法和容器链接起来的桥梁 容器就是链表&#xff0c;顺序表等数据结构&#xff0c;他们有各自的特点&#xff0c;所以底层结构是不同的。在不用迭代器的前提下&#xff0c;如果我们的算法要作用在容器上…

《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》

一、wiki.js 知识库简介 基本概述 定义 &#xff1a;Wiki.js 是一个开源、现代、轻量且功能强大的 Wiki 应用程序&#xff0c;基于 Node.js 构建&#xff0c;旨在帮助个人和团队轻松创建、管理和共享知识。开源性质 &#xff1a;它遵循 AGPLv3 许可证&#xff0c;任何人都可以…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…

微服务 day01 注册与发现 Nacos OpenFeign

目录 1.认识微服务&#xff1a; 单体架构&#xff1a; 微服务架构&#xff1a; 2.服务注册和发现 1.注册中心&#xff1a; 2.服务注册&#xff1a; 3.服务发现&#xff1a; 发现并调用服务&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3:OpenFeign OpenFeig…

网络安全:挑战、技术与未来发展

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着互联网的普及和信息技术的高速发展&#xff0c;网络攻击的…

PostgreSql-COALESCE函数、NULLIF函数、NVL函数使用

COALESCE函数 COALESCE函数是返回参数中的第一个非null的值&#xff0c;它要求参数中至少有一个是非null的; select coalesce(1,null,2),coalesce(null,2,1),coalesce(null,null,null); NULLIF(ex1,ex2)函数 如果ex1与ex2相等则返回Null&#xff0c;不相等返回第一个表达式的值…

neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.

目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j&#xff0c;参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后&#xff0c;重新登录网页版neo4j&#xff0c;发现对应的数据库状态变…

C语言【基础篇】之数组——解锁多维与动态数组的编程奥秘

数组 &#x1f680;前言&#x1f99c;数组的由来与用途&#x1f31f;一维数组详解&#x1f58a;️二维数组进阶&#x1f4af;动态数组原理&#x1f914;常见误区扫盲&#x1f4bb;学习路径建议✍️总结 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。本文收录于我的专…

TaskBuilder项目实战:创建项目

用TaskBuilder开发应用系统的第一步就是创建项目&#xff0c;项目可以是一个简单的功能模块&#xff0c;也可以是很多功能模块的集合&#xff0c;具体怎么划分看各位的实际需要&#xff0c;我们一般会将相互关联比较紧密的一组功能模块放到一个独立的项目内&#xff0c;以便打包…

基于DeepSeek API和VSCode的自动化网页生成流程

1.创建API key 访问官网DeepSeek &#xff0c;点击API开放平台。 在开放平台界面左侧点击API keys&#xff0c;进入API keys管理界面&#xff0c;点击创建API key按钮创建API key&#xff0c;名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…

Redis深入学习

目录 Redis是什么&#xff1f; Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快&#xff1f; Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致&#xff1f; 缓存穿透 缓存击穿 缓存雪崩 Redis是什么&#xff1f; redis是一…

Dockerfile 文件详解

在平常的开发工作中&#xff0c;我们经常需要部署项目&#xff0c;一个项目开发完成后&#xff0c;使用 Docker 方式部署&#xff0c;那么首先得构造镜像&#xff0c;构造镜像最主要的就是 Dockerfile 文件的编写&#xff0c;今天简单来总结下 Dockerfile 文件的编写以及有哪些…

开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)

一、前言 代码专家模型是基于人工智能的先进技术&#xff0c;它能够自动分析和理解大量的代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&a…

kubeadm构建k8s源码阅读环境

目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群&#xff0c;并没有达到最初看代码的目的。 所以继续看看kubeadm的代码&#xff0c;看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中&#xff0c;所以要先克隆k8s源码。之…

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误2&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误3&#xff0c;有时候还会提示你有一些…