1 对象的实例化过程

  • 对象的实例化过程是分成两部分:类的加载初始化,对象的初始化
  • 要创建类的对象实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化
  • 类初始化就是执行方法,对象实例化是执行方法
  • 一个子类要初始化需要先初始化父类

2 类的加载过程

  • 类的加载机制:如果没有相应类的class,则加载class到方法区。对应着加载->验证->准备->解析-->初始化阶段 加载:载入class对象,不一定是从class文件获取,可以是jar包,或者动态生成的class验证:校验class字节流是否符合当前jvm规范准备:为类变量分配内存并设置变量的初始值(默认值)。如果是final修饰的对象则是赋值声明值解析:将常量池的符号引用替换为直接引用初始化:执行类构造器(注意不是对象构造器),为类变量赋值,执行静态代码块。jvm会保证子类的执行之前,父类的先执行完毕
  • 其中验证、准备、解析3个部分称为 连接
  • 方法由静态变量赋值代码和静态代码块组成;先执行类静态变量显示赋值代码,再到静态代码块代码

3 触发类加载的条件

  • 第一次创建类的新对象时,会触发类的加载初始化和对象的初始化函数执行,这个是实例初始化,其他6个都是类初始化
  • JVM启动时会先加载初始化包含main方法的类
  • 调用类的静态方法(如执行invokestatic指令)
  • 对类或接口的静态字段执行读写操作(即执行getstatic、putstatic指令);不过final修饰的静态字段的除外(已经赋值,String和基本类型,不包含包装类型),它被初始化为一个编译时常量表达式 注意:操作静态字段时,只有直接定义这个字段的类才会被初始化;如通过其子类来操作父类中定义的静态字段,只会触发父类的初始化而不是子类的初始化
  • 调用JavaAPI中的反射方法时(比调用java.lang.Class中的方法(Class.forName),或者java.lang.reflect包中其他类的方法)
  • 当初始化一个类时,其父类没有初始化,则需先触发父类的初始化(接口例外)

4 对象的实例化过程

  • 对象实例化过程 其实就是执行类构造函数 对应在字节码文件中的()方法(称之为实例构造器);()方法由非静态变量、非静态代码块以及对应的构造器组成 ()方法可以重载多个,类有几个构造器就有几个()方法()方法中的代码执行顺序为:父类变量初始化,父类代码块,父类构造器,子类变量初始化,子类代码块,子类构造器。
  • 静态变量,静态代码块,普通变量,普通代码块,构造器的执行顺序
  • 具有父类的子类的实例化顺序如下

5 类加载器和双亲委派规则,如何打破双亲委派规则

  • 类加载器 通过一个类的全限定名来获取描述此类的二进制字节流,实现这个动作的代码模块称为类加载器任意一个类都需要其加载器和类本身来确定类在JVM的唯一性;每个类加载器都有自己的类名称空间,同一个类class由不同的加载器加载,则被JVM判断为不同的类
  • 双亲委派模型 启动类加载器有C++代码实现,是虚拟机的一部分。负责加载lib下的类库其他的类加载器有java语言实现,独立于JVM,并且继承ClassLoaderextention ClassLoader负责加载libext目录下的类库application ClassLoader 负责加载用户路径下(ClassPath)的代码不同的类加载器加载同一个class文件会导致出现两个类。而java给出解决方法是下层的加载器加委托上级的加载器去加载类,如果父类无法加载(在自己负责的目录找不到对应的类),而交还下层类加载器去加载。如下图
  • 打破双亲委派模型 双亲委派模型并不是一个强制的约束模型,而是java设计者推荐给开发者的类加载实现方式双亲委派模型很好的解决各个类加载基础类的同一问题(越基础的类由越上层的加载器加载),但是基础类总是作为用户代码调用的API,但是如果它的具体实现是下层的代码,此时基础类需要调用下层的代码,则需要打破双亲委派模型如JNDI服务,JNDI的代码有启动类去加载(rt.jar),它需要调用由独立厂商部署在应用程序classpath下的JNDI的SPI(Service Provider Interface)代码。为了解决SPI代码加载问题,java引入了线程上下文类加载器去加载SPI代码。也就是父类加载器请求子类去完成类的加载动作线程上下文类加载器,线程创建时会从父线程继承,如果全局范围没有设置过,则默认设置为application Class Loader

作者:clswcl
链接:https://juejin.im/post/6861940021146943502
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

java基础代码实例_基础篇:详解JAVA对象实例化过程相关推荐

  1. java中间件登陆超时_一文详解 Java 的几把 JVM 级锁

    作者 | 楚昭 来源 | 阿里巴巴中间件(ID:Aliware_2018) 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CP ...

  2. java四舍五入自己写_java提高篇-----详解java的四舍五入与保留位

    转载:http://blog.csdn.net/chenssy/article/details/12719811 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么 ...

  3. java 工具类命名_给大家详解16个超级实用的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章课工场合肥北大青鸟科海校区的袁老师将介绍Java中使用最频繁及最通用的Java工具类,希望对大家有所帮助. 以下工具类.方法按使用流行度排名,参考数据来 ...

  4. 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】

    Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...

  5. java中字输入输出异常_Java:详解Java中的异常(Error与Exception)

    一. 异常机制的概述 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 程序错误分为三种:1 ...

  6. java基础代码实例_全网都在找的Python简单基础小程序的实例代码

    这篇文章主要介绍了Python简单基础小程序的实例代码,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下. 1 九九乘法表 3 4 5 6 7for i in range(9):#从0循环到8 ...

  7. java基础代码实例_python基础编程:python下10个简单实例代码

    注意:我用的python2.7,大家如果用Python3.0以上的版本,请记得在print()函数哦! 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析 ...

  8. java 开发详解_面向接口编程详解-Java篇

    相信看到这篇文字的人已经不需要了解什么是接口了,我就不再过多的做介绍了,直接步入正题,接口测试如何编写.那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象.为充分考虑到初学者,所 ...

  9. java lock代码写法_java Lock接口详解及实例代码

    java  lock接口 java.util.concurrent.locks 接口lock public interface loce loce实现提供了比使用synchronized方法和语句可获 ...

最新文章

  1. php上传报文,PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性...
  2. cv2.circle函数
  3. Java 集合系列(4): LinkedList源码深入解析2
  4. stm32 独立看门狗学习
  5. 环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理
  6. 关于Hadoop的一些网络资料
  7. RK平台ubuntu安装vbox
  8. MFC中实现的画箭头算法 (Arrow in MFC)
  9. java保存图书每日的交易记录
  10. (转)详解HTML网页源码的charset格式
  11. java语言实现_java语言实现树
  12. python 驱动工控机板卡,研华工控机主板驱动下载
  13. 经典合成器和键盘合集-Arturia V Collection 7 v7.1.2 WiN
  14. 在keil MDK中定义非初始化(noini)变量
  15. 笔记本计算机工作站,笔记本篇:惠普ZBook G3工作站_Intel笔记本电脑_笔记本评测-中关村在线...
  16. 求助:大文件mp4恢复
  17. JVM中的monitorenter和monitorexit
  18. 新网工李白——>李白你好(来抽大奖啦~)
  19. win8 LIC1416N 许可证不能自动添加至节点锁定文件返回码是100.
  20. 国外LEAD流量基础

热门文章

  1. 全局事件总线 (GlobalEventBus)
  2. js 对象和构造函数
  3. appnode php,环境软件路径参考
  4. linux mysql 备份脚本_linux 之mysql备份脚本
  5. python数据分析实验报告_Python 数据分析入门实战
  6. AndroidJava List与equals的微妙关系,小心掉坑里
  7. 名爵如何解除限速_价格不高却乐趣十足,全新一代名爵6有多大惊喜
  8. 基于深度学习的手写数字识别、python实现
  9. 计算机硬件知识教学的信息化手段,《计算机硬件组成》教学设计
  10. python使用pkg包_Python deb-pkg-tools包_程序模块 - PyPI - Python中文网