java继承中创建父类对象相关知识点

  • 时间:
  • 9287人关注

下面小编就为大家带来一篇浅谈java继承中是否创建父类对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,另外这篇文章主要知识点是关于java继承、父类对象、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:
  • 编辑整理:居晴丽
  • 教程字数:1722字节
  • 阅读时间:大概19分钟
  • 下载本教程(DOC版)
  • 1.

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

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

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

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

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

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

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

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

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

    如果说子类可以强行转换成父类进行使用,那是因为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对象的内存布局由下:

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

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

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

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


    上一篇:Spring对IOC的知识点理解

    下一篇:实例讲述Java使用正则表达式截取重复出现的XML字符串功能

    相关内容

    • java继承包括静态方法吗

      java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏。也就是说在子类构造与父类同名同参的静态方法不是重写了父类的方法,而是重新的定义了一个方法,不能在此方法上面加@Override,否则报错。 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为隐藏。如果你想要调用父类的静态方法和属性,直接通

      12-02java中继承包括静态方法吗

      阅读更多
    • Java继承的是object吗

      所有类都是默认继承object类的,object类是java所有类的父类。你想要继承其它类的时候直接 extends 类名 就可以了,object类对这个没影响。

      11-26Java继承object吗

      阅读更多
    • Java继承概念知识点分享

      这篇文章主要介绍了Java继承概念详细解读,涉及继承的概念,合成的语法等相关内容,具有一定借鉴价值,需要的朋友可以参考下。

      09-10Java继承概念详细解读

      阅读更多
    • Java JDK 9学习笔记

      Java JDK 9学习笔记

      本书全新改版升级至Java JDK 9,汇集了学员在学习Java 或认证考试时遇到的概念、操 作、应用等问题及解决方案,适合Java 的初、中级读者以及广大Java 应用开发人员阅读

      大小:325.3 MBJava

      点击下载
    • JavaScript之美

      JavaScript之美

      阅读文章这书好像是坐着来与一些JavaScript大师共进午餐,听她们探讨她们现场不断涌现出去的新念头。JavaScript能够说成全世界*异议和别人误会*多的程序语言。许多人企图用别的语言替代它的

      大小:94 MBJavaScript

      点击下载
    • 云原生Java

      云原生Java

      不论是传统式IT制造行业,還是it行业,都正处在制造行业在历史上*强烈的转型中:很多的系统软件已经从传统式的IT构架刹车应用场景云的构架,开发方式也已经从开发设计和运维管理职责分

      大小:272.4 MB系统设计

      点击下载
    • Java从入门到精通(第5版)

      Java从入门到精通(第5版)

      开发软件视頻大讲堂全书是清华大学社计算机专科基本类零售业书籍1热销的知名品牌之一。 (1)全书总计市场销售200多万册,备受众多开发人员钟爱。 (2)4本喜获全制造行业优畅销书奖,

      大小:82.5 MBJava编程

      点击下载
    • 你不知道的JavaScript 下卷

      你不知道的JavaScript 下卷

      本书讲解JavaScript开发人员不求甚解的大趋势,深入理解语言内部的机制,全面介绍JavaScript中常被人误解和忽视的重要知识点,分为上中下三套,欢迎下载

      大小:7 MBJavaScript

      点击下载
    • Java设计模式深入研究

      Java设计模式深入研究

      《Java设计模式深入研究》对高级程序员、软件工程师、系统架构师等专业研究人员也具有一定的参考价值。 Java设计模式深入研究 第1章 接口与抽象类 第2章 反射 第3章 工厂模式 第4章 生成器

      大小:49.2 MBJava

      点击下载
    • Java语言程序设计与数据结构:基础篇(第11版)

      Java语言程序设计与数据结构:基础篇(第11版)

      Java语言程序设计是Java语言的经典教材,本书全面整合了Java 8的特性,采用“基础优先,问题驱动”的教学方式,循序渐进地介绍了程序设计基础、解决问题的方法、面向对象程序设计、图形用

      大小:259 MBJava

      点击下载
    • Java从入门到精通(第4版)

      Java从入门到精通(第4版)

      本书从初学者角度,以通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识,所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会Java程序开发的精髓,欢迎下载

      大小:292.7 MBJava编程

      点击下载
    • Java面向对象编程(第2版)

      Java面向对象编程(第2版)

      本书以行云流水般的语言诠释Java编程艺术,基于全新Java技术、理论紧密结合实际,详细讲解Java面向对象的编程思想、编程语法和设计模式等,可作为开发指南、高校教材和认证辅导教材,

      大小:136 MBJava

      点击下载
    • JavaScript编程全解

      JavaScript编程全解

      JavaScript编程全解 全方位地介绍了JavaScript开发中的各个主题,无论是前端还是后端的JavaScript开发者都可以在本书中找到自己需要的内容。本书对HTML5、Web API、Node.js及WebSocket等最新的热门技术也

      大小:6.67 MBjs编程

      点击下载

    学习笔记

    6小时47分钟前回答

    Java继承概念知识点分享

    继承与合成基本概念 继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。 合成:在新类里创建原有的对象称为合成。这种方式可以重复利用现有的代码而不更改它的形式。 1.继承的语法 关键字extends表明新类派生于一个已经存在的类。已存在的类称为父类或基类,新类称为子类或派生类。例如: class Student extends Person {} 类Student继承了Person,Person类称为父类或基类,Student类称为子类或派生类。 2.合成的语法 合成比较简单,就是在一个类中创建一个已经存在的类。 class Student { Dog dog;} 上溯造型 1.基本概……

    48小时24分钟前回答

    Java面向对象编程中类的继承用法总结

    本文实例讲述了Java面向对象编程之类的继承。分享给大家供大家参考,具体如下: 继承: 特殊类拥有一般类的全部属性与行为。 继承好处: 1.提高了代码的复用性 2.让类与类之前产生了关系,有了这个关系才有多态的特性。继承是类和类之前的关系。 注意事项: 1.java只支持单继承,不支持多继承。因为多继承有安全隐患:当多个父类定义相同的函数,但是功能不同时,子类不知道运行哪一个。 2.子类继承父类时,继承了父类的所有方法和属性,可直接使用。 3,java支持多层继承,即:孙-子-父的关系 语法: [类修饰符] class 子类名 extends 父类名{ 语句;} 例如: class Pserson{ int age; String name; public void ……

    24小时25分钟前回答

    java可以多继承吗

    java不支持多继承,只支持单继承(即一个类只能有一个父类)。但是java接口支持多继承,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能) Java为什么不能多继承,但是可以多实现 假定A类和B类都是有t方法,且实际完成不一样。C类继承A类和B类,当C类启用t方法时,会出現模棱两可。由于,A类和B类都是有t方法,但实际完成不一样。能够 多完成是由于,接口中的方法沒有实际完成。继承好几个接口,即使2个接口中有同样的方法,也不会出現矛盾。 不支持,Java中每个类都只能继……

    26小时26分钟前回答

    JavaScript的6种继承方式总结

    继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。 原型链 首先得要明白什么是原型链,在一篇文章看懂proto和prototype的关系及区别中讲得非常详细 原型链继承基本思想就是让一个原型对象指向另一个类型的实例 function SuperType() { this.property = true } SuperType.prototype.getSuperValue = function () { return this.property } function SubType() { this.subproperty = false } SubType.prototype = new SuperType() SubType.prototype.getSubValue = function () { return this.subproperty } var instance = new SubType() console.log(instance.getSuperValue()) // true 代码定义了两个类型SuperType和SubType,每个类型分别有一个……