来源:https://url.cn/5V55xBu

一.  前言

Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。

加载并初始化类完成后,再进行对象的创建工作。我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。

二.  类加载过程(第一次使用该类)

java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程:双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要加载的类)时,子加载器才会尝试自己去加载。

使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。

1.加载

由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例

2.验证

格式验证:验证是否符合class文件规范

语义验证:检查一个被标记为final的类型是否包含子类;检查一个类中的final方法是否被子类进行重写;

确保父类和子类之间没有不兼容的一些方法声明(比如方法签名相同,但方法的返回值不同)

操作验证:在操作数栈中的数据必须进行正确的操作,对常量池中的各种符号引用执行验证(通常在解析阶段执行,检查是否可以通过符号引用中描述的全限定名定位到指定类型上,以及类成员信息的访问修饰符是否允许访问等)

3.准备

为类中的所有静态变量分配内存空间,并为其设置一个初始值(由于还没有产生对象,实例变量不在此操作范围内)

被final修饰的static变量(常量),会直接赋值;

4.解析

将常量池中的符号引用转为直接引用(得到类或者字段、方法在内存中的指针或者偏移量,以便直接调用该方法),这个可以在初始化之后再执行。

解析需要静态绑定的内容。// 所有不会被重写的方法和域都会被静态绑定

以上2、3、4三个阶段又合称为链接阶段,链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中。

5.初始化(先父后子)

为静态变量赋值

执行static代码块

注意:static代码块只有jvm能够调用

如果是多线程需要同时初始化一个类,仅仅只能允许其中一个线程对其执行初始化操作,其余线程必须等待,只有在活动线程执行完对类的初始化操作之后,才会通知正在等待的其他线程。

因为子类存在对父类的依赖,所以类的加载顺序是先加载父类后加载子类,初始化也一样。不过,父类初始化时,子类静态变量的值也有有的,是默认值。

最终,方法区会存储当前类类信息,包括类的静态变量、类初始化代码(定义静态变量时的赋值语句 和 静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块和构造方法)和实例方法,还有父类的类信息引用。

三.  创建对象

1.在堆区分配对象需要的内存

分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量

2.对所有实例变量赋默认值

将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值

3.执行实例初始化代码

初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法

如果有类似于Child c = new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它

需要注意的是,每个子类对象持有父类对象的引用,可在内部通过super关键字来调用父类对象,但在外部不可访问

四.  补充

通过实例引用调用实例方法的时候,先从方法区中对象的实际类型信息找,找不到的话再去父类类型信息中找。

如果继承的层次比较深,要调用的方法位于比较上层的父类,则调用的效率是比较低的,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表的方法来优化调用的效率。

所谓虚方法表,就是在类加载的时候,为每个类创建一个表,这个表包括该类的对象所有动态绑定的方法及其地址,包括父类的方法,但一个方法只有一条记录,子类重写了父类方法后只会保留子类的。当通过对象动态绑定方法的时候,只需要查找这个表就可以了,而不需要挨个查找每个父类。

- End -

(可点击跳转即可阅读

面试题系列教程  点击--> 面试题技术干货连载目录 跳转

Maven系列教程  点击--> Maven技术干货连载目录 跳转

MyBatis系列教程  点击--> MyBatis技术干货连载目录 跳转

, 

今日头条面试官竟然问我new一个对象背后发生了什么?这太难了...相关推荐

  1. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

  2. 3 连接sybase_今日头条面试官:给我说说数据库连接池的原理?

    作者:敦格 来源:https://urlify.cn/ABJbum 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. # 早期我们怎么进行 ...

  3. 原创 | 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?...

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 254篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 在Java基础中,集合 ...

  4. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...

  5. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?|附视频讲解

    关于String有没有长度限制的问题,我之前单独写过一篇文章分析过,最近我又抽空回顾了一下这个问题,发现又有了一些新的认识.于是准备重新整理下这个内容. 这次在之前那篇文章的基础上除了增加了一些验证过 ...

  6. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?

    String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Java中的S ...

  7. 2020今日头条面试真题及答案整理最新最全持续更新中~~~~

    大家好,我是好好学习天天编程的天天 一个整天在互联网上爬虫的程序员,每天给大家分享学习干货的攻城狮 2020今日头条面试真题及答案整理&最新最全&持续更新中~~~~ 2020今日头条面 ...

  8. 屏蔽广告软件测试工程师,2018北京今日头条面试经验(广告优化师,软件测试工程师等)...

    为了帮助职业圈网友能够及时了解北京今日头条的面试流程以及面试过程所涉及的面试问题,职业圈小编把2018最新北京今日头条面试经验编辑好,马上提供给大家,以便能够尽快帮助到有需要的人.文章中还为你提供北京 ...

  9. 程序猿的今日头条面试历险记(一)

    FIN 介绍 上图是小姐姐旅行过程中拍的风景图.先来介绍下今天的女主角,毕业自中科大研究生,拿了一大堆大厂的 offer.这次的面试是小姐姐在云南旅行中进行的,目前已经完成了二面,今天这篇文章是对一面 ...

最新文章

  1. C2:抽象工厂 Abstract Factory
  2. 部署JTBC2.0网上商城(apache+tomcat+mysql)
  3. ImportError: No module named sklearn.metrics
  4. 14 | 深入解析Pod对象(一):基本概念
  5. springboot超详细教程_超详细便当袋教程 || 特殊时期,自己带饭最安心!
  6. LeetCode 1705. 吃苹果的最大数目(优先队列)
  7. myEclipse怎样将程序部署到tomcat(附录MyEclipse调试快捷键)
  8. 程序员斗图时最爱用哪些表情包?拿走不谢!
  9. 如何在Mac上的“终端”中创建自定义功能键?
  10. 怎样用js结合h5画出多头像组合头像
  11. 如何学习Vim(转)
  12. 航空订票系统设计(java、数据库、通信联合项目)
  13. git push或git pull等其他git命令 出现unable to access ‘https://gitee.com/你的git仓库地址)清除网络代理
  14. mysql中的count函数解释
  15. 戴尔游匣G15 5520成功安装ubuntu2004 intel ax201 驱动(亲测可用)
  16. MMA-mathematica绘图
  17. Zeus: Uber 开发的分布式的高扩展 Shuffle 服务组件
  18. mysql数据库技术_MySQL数据库操作技术大全
  19. 升级windows11后wireshark显示wireshark Can‘t get list of interfaces: PacketGetAdapterNames报错
  20. 绘制中国近海的sst分布图

热门文章

  1. 舍与得 -- 诠释舍得
  2. linux selinux 关闭保存 centos,CentOS 8 禁用 SELinux 教程
  3. 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
  4. 快速找回忘记的宽带账号和密码
  5. SystemVerilog搭建APB_I2C IP 层次化验证平台
  6. 记一次使用mavon-editor编辑器的使用过程,添加自己的功能
  7. Unity 鼠标样式修改
  8. 设置数据表格的各种功能
  9. Tomcat 闪退解决方法
  10. 兆骑科创高层次人才引进平台,创新创业赛事活动路演