• java面试一日一题:java中一个对象实例的结构是什么样子的


    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的

    分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的

    回答要点:

    主要从以下几点去考虑,

    1、对象实例存储在什么位置

    2、程序运行时一个对象实例的数据结构是什么样子的

    都知道在java中万事万物都是对象,例如,

    public class User{
    
    private String name;
    private int age;
    private String address;
    //年龄加1
    public int incrAge(){
      
      return ++age;
    
    }
    //更新住址,并返回老住址
    public String modifyAddress(String newAddress){
    
       this.address=newAddress;
       return this.address;
    }
    
    }

    上面是一个User类,有三个属性和两个方法,那么在执行了下面的代码,

    User user=new User();

    之后,在内存中会发生什么变化。

    user肯定要在栈中分配内存,因为它仅仅是一个引用,在java的hotspot虚拟机中一个引用栈4个字节;

    user指向的User对象在堆中分配了内存,会形成一个User的实例,这个实例长什么样子,

    包含对象头、实例数据、填充区三部分;

    对象头

    对象头分为两部分,mark word和klass。

    mark word中包含了hashcode、GC分代年龄(默认为15)、锁状态标识位、保存持有偏向锁的线程ID、偏向时间戳等。mark word中保存的信息和synchronized有很大的关系,

    klass中保存了指向方法区中该类的元信息,表明该实例是哪个类的对象。

    实例数据

    在实例数据中存储的是该对象中的属性,以上面的User对象为例,存储的是name、age、address三个属性。由于java中的数据类型有基本类型和引用类型,在实例对象中的属性如果是基本类型那么存储的便是其值,如果属性是引用类型那么存储的是一个地址。如果该类显示的指定了父类或者接口,那么根据可见性还会有父类或接口的属性信息。

    这里有个疑问在类中有属性和方法,属性存在于实例中也就是在内存中的堆中,那么类中的方法那?方法存储在方法区,在方法区中会有该类的方法信息。

    填充区

     填充区可有可无。在hotspot虚拟机中要求给对象实例分配内存时,内存的起始地址必须是8的整数倍,也就是对象所占用的内存大小必须是8的整数倍,在对象头的大小肯定是8的整数倍,实例数据有可能不是8的整数倍,这时候填充区便会进行补充直到8的整数倍为止。

    有不当之处,欢迎指正,谢谢

    一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗
  • 相关阅读:
    C++学习笔记1——const
    反转二叉树
    pywinauto 使用
    pywinauto 的使用
    爬虫基础知识
    mongdb安装配置
    pyinstaller
    Python3.6+pyinstaller+Django
    py2exe安装使用
    cx_freeze的安装使用
  • 原文地址:https://www.cnblogs.com/teach/p/14772034.html
Copyright © 2020-2023  润新知