当前位置: 首页 > news >正文

新数据结构(4)——Java继承

基本概念

继承的本质:重复使用已经定义好的方法和域,实现代码的重复利用。

使用继承之后,创建的子类可以方便地调用父类中已经定义的方法。

一个继承的例子:

重载和重写

重载

重载:发生在同一个类里,指的是方法名相同但是参数列表(包括参数类型、数量或顺序)不同。

重载的一个例子:

public void run(){

}
public void run(String nane){

}
public void run(int age){

}

重写

重写(或覆盖):子类重写父类的方法,指的是子类中的方法与父类中的方法具有相同的方法名和参数列表(包括参数类型和数量)。

重写的一个例子:

重写后,如果声明一个父类类型的变量并指向一个父类的实例,那么将使用父类原本的方法(如下图)。在这种情况下,即使存在子类对父类方法的重写,由于实际指向的是父类对象,因此调用的仍然是父类的方法。在内存中,如果仅创建了父类对象而没有创建子类对象,那么即使子类重写了父类的方法,这些重写的方法也不会被调用,因为内存中只有父类对象的实例存在。

重写后,如果声明一个子类类型的变量指向一个子类的实例,并通过这个变量调用被重写的方法,那么将使用子类重写的方法(如下图)。在这种情况下,由于实际指向的是子类对象或者声明的就是子类类型,因此调用的将是子类中重写后的方法。

重写后,如果声明一个父类类型的变量指向一个子类的实例,并通过这个变量调用被重写的方法,那么将使用子类重写的方法(如下图)。在这种情况下,由于实际指向的是子类对象或者声明的就是子类类型,因此调用的将是子类中重写后的方法。

加载顺序

在Java程序的执行过程中,静态类(或包含静态成员和静态初始化块的类)会在类加载阶段最先被加载到内存中。这个加载过程发生在程序执行之前,确保静态成员被初始化,并且静态初始化块中的代码在类第一次被引用时执行。

首先调用父类(如上图和下图)

如下图,当Java程序运行时,如果创建了子类对象,JVM(Java虚拟机)会在内存中为子类对象分配空间。由于子类继承了父类,JVM也会确保父类的相关信息(如父类的字段和方法)在需要时被加载到内存中。但是,这并不意味着“父类对象”被“创建”了;实际上,只有子类对象被创建,而父类的信息是以一种特殊的方式(如通过类加载器)被访问和利用的。

从内存角度看方法重写

重写后,当通过子类对象调用被重写的方法时,子类将调用其自己提供的重写方法,而不是继承自父类的原始方法。

上图代码在内存里的体现

当声明一个父类类型的引用变量并让它指向一个父类对象时,通过该引用变量调用方法会调用父类原本的方法,因为此时内存中只有父类对象的实例,没有子类对象的实例存在。

上图的内存图

super关键字

super 关键字可以在子类中用来显式地调用父类的方法或构造器。当在子类中重写父类的方法时,可以使用 super 关键字来调用被重写的父类方法,以保持对父类行为的访问。同样地,在子类的构造器中,可以使用 super 关键字来调用父类的构造器,以确保父类被正确初始化。

调用父类的方法

调用父类的构造器(必须在子类构造方法里调用)

综合应用(判断执行顺序)

类加载

-当Java虚拟机(JVM)启动并运行一个Java程序时,它会加载程序中用到的所有类。在这个例子中,Demo类和Test类都会被加载。

-类加载是Java虚拟机将类的描述信息从类文件(.class文件)加载到内存,并对类数据进行校验、转换和初始化等过程。

静态代码块的执行

-在类加载的过程中,JVM会执行类中的静态代码块。静态代码块在类加载时执行,且只执行一次。

-在Demo类中,有两个静态代码块(尽管第二个静态代码块由于语法错误11e和重复的static{而不会被正确执行),但第一个静态代码块System.out.println("11");会被执行。

-同时,在静态代码块中还有一个静态变量的初始化public static Demo demo=new Demo("+++");。这个静态变量的初始化也会导致Demo类的构造器被调用,并打印出"===+++"

main方法的执行

-当类加载和静态代码块执行完毕后,JVM会开始执行main方法,这是Java程序的入口点。

-在Test类的main方法中,创建了一个新的Demo对象Demo demo=new Demo("---");。这会导致Demo类的构造器再次被调用,并打印出"===---"

相关文章:

  • springboot配置https
  • 【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知
  • 编码格式大全解释以及相关编码特性
  • Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)
  • DeepSeek-R1技术革命:用强化学习重塑大语言模型的推理能力
  • 10. Hbase Compaction命令
  • webpack配置之---output.publicPath
  • 机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确
  • 语言大模型基础概念 一(先了解听说过的名词都是什么)
  • [Redis] Redis分布式锁与常见面试题
  • x64、aarch64、arm与RISC-V64:详解四种处理器架构
  • 2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)
  • 从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
  • 微服务与网关
  • 数仓:核心概念,数仓系统(ETL,数仓分层,数仓建模),数仓建模方法(星型模型,雪花模型,星座模型)和步骤
  • mongodb
  • 【Spring】什么是Spring?
  • Hive增量迁移方案与实操PB级
  • STM32系统架构介绍
  • 使用 LangChain 对接硅基流动(SiliconFlow)API:构建一个智能对话系统
  • 流失79载,国宝文物“子弹库帛书”(二、三卷)回归祖国
  • 董军同德国国防部长举行会谈
  • 南方降水频繁暴雨连连,北方高温再起或现40°C酷热天气
  • 六连板成飞集成:航空零部件业务收入占比为1.74%,市场环境没有重大调整
  • 乌拉圭前总统何塞·穆希卡去世
  • 新华时评:中美经贸会谈为全球经济纾压增信