`

java父子类在内存中以何种形式关联

    博客分类:
  • jvm
阅读更多
最易理解的一种方式是,创建对象时先实例化父类对象,然后实例化子类对象,将父类对象引用当做子类对象的属性赋值给子类对象。而这个属性名称当简单理解为super(隐式的对象组合?)

创建有父类的子类的对象时,是不是在内存中会创建2个对象,一个指向子类一个指向父类?


为了验证这种假设,以下为根据<深入理解java虚拟机>而得来的理解

对于只需要应用这种特性的开发人员来说,这种解释比较简单

而实际到底是怎样的呢?

这种继承关系可以从2个方面解释

一是类的继承关系

二是是当创建子类对象时,这种关系在内存中是如何实现的


1.类的继承关系
在<深入理解java虚拟机>,讲到Class类文件的结构,其结构中包含了这里讲到的继承关系

this_class
super_class
interfaces

这里的super_class存储的就是该类的父类,所以jvm硬编码实现了这种继承特性。通过super_class可以找到父类的全量名


字段表集合:字段表集合中不会列出从超类或者父接口中继承而来的字段,但有可能列出原本java代码之中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的引用 p178


方法表集合:与字段表集合相对应的,如果父类方法在子类中没有被重写,方法表集合中就不会出现来自父类的方法信息





2.这种继承关系在对象中是如何体现的?(隐式的组合?)
<深入理解java虚拟机>中讲到,对象在内存中(堆)分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)

对象头中(Header)与继承关系有关的就是类型指针,通过该指针查找其类元数据的指针。而通过instanceof运算符时,可判断是否为父类实例,我想这里是通过类的继承关系super_class来判断的,而不是通过对象来体现父子关系的


实例数据(Instance Data)
<深入理解java虚拟机>中讲到,无论是从父类继承下来的,还是在子类中定义的,都需要记录在实例数据模块中。
这里有2个解释:
一种是创建了父类的副本
可以理解为创建子类对象时,父类中对象的变量也会在子类中创建一个相同的副本,这2份变量创建完之后,应该是没有关系了,互不影响(符合以上隐式组合的假设)

第二种解释:这些变量就是父类的变量,super指向的变量就是这部分变量(并没有创建父类对象实例)

通过从其他文章或论坛得到的信息,这里偏向第二种解释。
那super.方法名该怎么解释呢,通过类文件结构中super_class来找到方法?


<深入理解java虚拟机>中并没有显式讲到this super是什么?




参考:
java中,创建子类对象时,父类对象会也被一起创建么?
https://www.zhihu.com/question/51920553

java 的继承原理
http://blog.csdn.net/tangtang5156/article/details/44218919

从原理来理解继承关系的类初始化和实例化的顺序:
https://my.oschina.net/xpbug/blog/111371
分享到:
评论

相关推荐

    Java基础复习笔记01数组_内存形式_父子_内存控制

    - **类对象**: 在Java中,每个类都有一个对应的类对象,该对象包含了类的信息(如方法、字段等),并存储在方法区中。 - **实例对象**: 实例对象是通过类对象创建的具体对象。当通过`new`关键字创建一个对象时,实际...

    java父子资料(答案)

    - **知识点**: 在 Java 程序中定义的类可以包含两种成员: - **成员变量**: 存储类的状态信息。 - **成员方法**: 定义类的行为。 **8. 主类的概念** - **知识点**: Java 程序中的主类是指包含 `main` 方法的类,...

    父子实例的内存控制.rar_父子实例的内存控制

    在Java编程语言中,"父子实例的内存控制"是一个重要的概念,主要涉及到继承关系下的对象引用和内存管理。当我们创建一个子类对象时,它同时继承了父类的所有非私有属性和方法。这里,我们将深入探讨如何通过父类类型...

    【JavaScript源代码】element的el-tree多选树(复选框)父子节点关联不关联.docx

    在某些系统中,例如权限管理或者角色菜单配置,可能需要一种混合的父子关联行为,即在通过函数设置节点选中状态时,需要严格根据提供的勾选列表来决定,而在用户交互时,希望点击父节点能够影响其所有子节点的选中...

    父子进程之间的共享内存

    父子进程之间的共享内存,父子之间的互相通信。

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    父子类接口实验

    8. **父子类转换**:在Java中,一个子类对象可以被强制转换为父类类型,但需要注意的是,父类引用只能调用父类的方法,不能调用子类特有的方法。在本实验中,虽然没有直接展示转换操作,但在实际应用中,这种转换...

    简单的java类的重写还有父子类的练习(多种图形面积求取)

    这个练习不仅涵盖了Java中的继承和重写概念,还涉及到了抽象类、接口(虽然这里没有用到)、构造函数以及数学运算在编程中的应用。这种设计模式使得代码结构清晰,易于扩展,当需要添加新的图形类型时,只需创建一个...

    接口,父子类的转换关系

    在编程领域,接口和父子类的转换关系是面向对象编程中的核心概念,它们在软件设计中扮演着至关重要的角色。接口定义了一组方法签名,而父类(也称为基类)提供子类可以继承的属性和行为。让我们深入探讨这两个概念...

    java类加载器-tomcat中的类加载器

    在Java中,类加载器主要分为三个层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap ClassLoader负责加载JDK的核心库,如rt.jar;Extension ClassLoader则加载JRE扩展目录下的jar文件...

    Java中类的生命周期.doc

    ### Java中类的生命周期 #### 一、概述 在Java编程语言中,类的生命周期是从类被加载到Java虚拟机(JVM)中开始,经过一系列处理直至类被卸载的过程。这一过程中涉及的关键步骤包括类的加载、连接、初始化等。理解...

    java集合思维导图

    Java集合框架是Java编程语言中的一个核心部分,它为数据存储和管理提供了高效且灵活的解决方案。本思维导图及总结旨在深入理解并掌握Java集合的相关概念和使用方法。 首先,我们来了解一下Java集合框架的基本构成。...

    深入探讨 Java 类加载器

    类加载器的概念始于JDK 1.0,最初是为了解决Java Applet在浏览器中的运行需求,而现在它在Web容器和模块化系统如OSGi中扮演着至关重要的角色。 类加载器工作流程通常涉及以下几个步骤: 1. **加载**:加载阶段,类...

    c++继承中的内存布局 - 开源中国社区.pdf

    在单继承中,派生类的对象在内存中的布局包括基类成员变量和派生类新增成员变量。如果派生类没有添加新的数据成员,则其对象大小与基类相同。 假设存在一个基类`B`和一个派生类`D`: ```cpp struct B { int b; };...

    父子节点获取

    在这个场景中,我们讨论的是如何在同一个数据表中管理父子节点,并通过工具类和实现类来实现这一功能。 首先,我们要理解树形结构的基本概念。在树结构中,每个节点都有一个父节点(除了根节点),并且可以有零个或...

    基于java涉及父子类的异常详解

    本文将详细解析Java中父子类之间的异常处理规则。 1. 子类构造函数与父类构造函数的异常处理 Java中的构造函数并不受到覆盖方法的异常限制。这意味着子类构造函数可以抛出任何类型的异常,而不必考虑父类构造函数...

    Java导出数据到Excel文件中(支持多表头)

    在Java中,通常会使用`try-with-resources`语句确保资源得到正确关闭。 总结来说,Java导出数据到Excel文件支持多级表头的过程涉及以下步骤: 1. 引入Apache POI库。 2. 创建`SXSSFWorkbook`和`SXSSFSheet`对象。 3...

    java中四个核心思想

    Java中的类装载器采用了一种层次化的体系结构,主要包括以下几种类型的装载器: - **启动类装载器(Bootstrap Class Loader)**:这是系统级的类装载器,用于装载Java的核心类库,如`java.lang.*`等,它是所有其他类...

Global site tag (gtag.js) - Google Analytics