浅谈java继承中是否创建父类对象

 更新时间:2017年06月20日 09:55:14   投稿:jingxian  
下面小编就为大家带来一篇浅谈java继承中是否创建父类对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1.

调用父类构造方法是真的,但是根本没有创建父类对象,只不过是调用父类构造方法来初始化属性。

如果说调用父类构造方法就等于创建父类对象,那就真的无稽之谈。

new指令开辟空间,用于存放对象的各个属/性引用等,反编译字节码你会发现只有一个new指令,所以开辟的是一块空间,一块空间就放一个对象。

然后,子类调用父类的属性,方法啥的,那并不是一个实例化的对象。

在字节码中子类会有个u2类型的父类索引,属于CONSTANT_Class_info类型,通过CONSTANT_Class_info的描述可以找到CONSTANT_Utf8_info,然后可以找到指定的父类啊啥的。

你的方法啊,属性名称都是在这个上面解析出来的,然后实际变量内容存储在new出来的空间那里。。。

super这个关键字只不过是访问了这个空间特定部分的数据(也就是专门存储父类数据的内存部分)。。。。。。

默认的hashcode和equals(直接使用的==比较)都是一样的,所以,这根本就在一个空间里,也不存在单独的出来的父类对象。

如果说子类可以强行转换成父类进行使用,那是因为java虚拟机有个静态类型(外观类型)和实际类型的概念。

如Object t=new Point(2,3);

那么Object属于静态类型(外观类型),Point属于实际类型。

静态类型和实际类型在程序中都可以发生变化,区别是静态类型的变化仅仅发生在使用时发生,而变量本身的静态类型不会改变,并且最终的静态类型是在编译期间可知的;而实际变量类型的变化结果只有在运行期间才能被确定,编译器在编译的时候并不知道变量的实际类型是什么。

2.

java对象的内存布局是由对象所属的类确定。也可以这么说,当一个类被加载到虚拟机中时,由这个类创建的对象的布局就已经确定下来的啦。

Hotspot中java对象的内存布局:

每个java对象在内存中都由对象头和对象体组成。

对象头是存放对象的元信息,包括该对象所属类对象Class的引用以及hashcode和monitor的一些信息。

对象体主要存放的是java对象自身的实例域以及从父类继承过来的实例域,并且内部布局满足由下规则:

规则1:任何对象都是8个字节为粒度进行对齐的。

规则2:实例域按照如下优先级进行排列:长整型和双精度类型;整型和浮点型;字符和短整型;字节类型和布尔类型,最后是引用类型。这些实例域都按照各自的单位对齐。

规则3:不同类继承关系中的实例域不能混合排列。首先按照规则2处理父类中的实例域,接着才是子类的实例域。

规则4:当父类中最后一个成员和子类第一个成员的间隔如果不够4个字节的话,就必须扩展到4个字节的基本单位。

规则5:如果子类第一个实例域是一个双精度或者长整型,并且父类并没有用完8个字节,JVM会破坏规则2,按照整形(int),短整型(short),字节型(byte),引用类型(reference)的顺序,向未填满的空间填充。

以上就是java对象的内存布局的规则。

接下来说一下java对象的实例化方法,也就是常见的<init>方法。

当我们new一个对象时,其实jvm已经把这个对象的整个空间已经分配好,并且整个对象的实例域布局已经确定下来啦。

实例化方法<init>就是将对象实例域的值设置到相应空间中。

<init>方法以调用父类的<init>方法开始,以自身构造方法作为结束。实例域的声明与实例初始化语句块的位置关系会影响编译器生成的<init>方法的字节码顺序。

还是以一个例子说明一下:

class Parent {
private short six;
private int age;
}

class Sub extend Parent{
private String name;
private int age;
private float price;
}

 

当前Sub对象的内存布局由下:

super所谓的父类存储空间的表示到底是什么意思?

这里的super存储我想就是绿色的那个位置吧!

以上这篇浅谈java继承中是否创建父类对象就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis判断int是否为空的时候,需要注意的3点

    mybatis判断int是否为空的时候,需要注意的3点

    这篇文章主要介绍了mybatis判断int是否为空的时候,需要注意的3点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 解决IDEA创建SpringBoot项目没有Java版本8问题

    解决IDEA创建SpringBoot项目没有Java版本8问题

    这篇文章主要介绍了解决IDEA创建SpringBoot项目没有Java版本8问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • SpringBoot @Retryable注解使用

    SpringBoot @Retryable注解使用

    SpringBoot提供的@Retryable注解可以方便地实现方法的重试机制,可以在不侵入原有逻辑代码的方式下,优雅地实现重处理功能
    2024-12-12
  • 浅谈js文件引用方式及其同步执行与异步执行

    浅谈js文件引用方式及其同步执行与异步执行

    下面小编就为大家带来一篇浅谈js文件引用方式及其同步执行与异步执行。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java并发程序刺客之假共享的原理及复现

    Java并发程序刺客之假共享的原理及复现

    前段时间在各种社交平台“雪糕刺客”这个词比较火,而在并发程序中也有一个刺客,那就是假共享。本文将通过示例详细讲解假共享的原理及复现,需要的可以参考一下
    2022-08-08
  • Java中IO流简介_动力节点Java学院整理

    Java中IO流简介_动力节点Java学院整理

    Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。接下来通过本文给大家介绍Java中IO流简介,感兴趣的朋友一起看看吧
    2017-05-05
  • Java命令行下Jar包打包小结

    Java命令行下Jar包打包小结

    这篇文章主要介绍了Java命令行下Jar包打包小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Spring Boot 整合 MyBatis 连接数据库及常见问题

    Spring Boot 整合 MyBatis 连接数据库及常见问题

    MyBatis 是一个优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射,下面详细介绍如何在 Spring Boot 项目中整合 MyBatis 并连接数据库,感兴趣的朋友一起看看吧
    2025-03-03
  • Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式

    Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式

    这篇文章主要介绍了Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring中propagation的传播机制详解

    Spring中propagation的传播机制详解

    这篇文章主要介绍了Spring中propagation的传播机制详解,要搞懂事务的传播机制,那么就要明白逻辑事务中各个事务的关系,才能彻底理解事务传播特性,在Spring事务中,各个逻辑事务的关系可以是并列、覆盖或包含,需要的朋友可以参考下
    2023-12-12

最新评论