JAVA对象创建的过程
Java中一个实例对象被创建的过程
一、类的加载过程
首先,Jvm在执行时,遇到一个新的类时,会到内存中的方法区去找class的信息,如果找到就直接拿来用,如果没有找到,就会去将类文件加载到方法区。在类加载时,静态成员变量加载到方法区的静态区域,非静态成员变量加载到方法区的非静态区域。
静态代码块是在类加载时自动执行的代码,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。
加载过程:
1、JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.clss加载到方法区。
2、在.class加载到方法区时,先加载父类再加载子类;先加载静态内容,再加载非静态内容
3、加载静态内容:
- 把.class中的所有静态内容加载到方法区下的静态区域内
- 静态内容加载完成之后,对所有的静态变量进行默认初始化
- 所有的静态变量默认初始化完成之后,再进行显式初始化
- 当静态区域下的所有静态变量显式初始化完后,执行静态代码块
4、加载非静态内容:把.class中的所有非静态变量及非静态代码块加载到方法区下的非静态区域内。
5、执行完之后,整个类的加载就完成了。
对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。
二、对象的创建过程
1、new一个对象时,在堆内存中开辟一块空间。
2、给开辟的空间分配一个地址。
3、把对象的所有非静态成员加载到所开辟的空间下。
4、所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化。
5、所有非静态成员变量默认初始化完成之后,调用构造函数。
6、在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,
====①执行super()语句 ②对开辟空间下的所有非静态成员变量进行显示初始化 ③执行构造代码块====
再执行构造函数中书写的代码。
7、在整个构造函数执行完并弹栈后,把空间分配的地址赋给引用对象。
注: super语句,可能出现以下三种情况:
1)构造方法体的第一行是this()语句,则不会执行隐式三步,而是调用this()语句所对应的的构造方法,最终肯定会有第一行不是this语句的构造方法。
2)构造方法体的第一行是super()语句,则调用相应的父类的构造方法,
3)构造方法体的第一行既不是this()语句也不是super()语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因。
最新文章
- git did not exit cleanly
- [iOS Keychain本地长期键值存储]
- Linux_linux中profile、bashrc、bash_profile之间的区别和联系(转)
- JavaScript 在页面上显示数字时钟
- XMPP协议介绍
- 9、Http回顾/Servlet
- LA 3177 Beijing Guards(二分法 贪心)
- How To Learn English Very Fast
- ARM处理器简介
- tablespace(表空间) / segment(断) / extent(盘区)/ block(块)/datafile(文件)之间的关系
- php处理数据分组问题
- 20165305 苏振龙《Java程序设计》第三周学习总结
- popen strtok 函数的使用
- Tomcat中的Web.xml和servlet.xml的学习
- (最小生成树)Agri-Net -- POJ -- 1258
- web页面超时自动退出方法
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- 日志输出:控制台和log文件输出日志
- enmu枚举类型
- 【BZOJ3611】大工程(虚树,动态规划)
热门文章
- BZOJ 3296 [USACO2011 Open] Learning Languages:并查集
- ES doc_values介绍——本质是field value的列存储,做聚合分析用,ES默认开启,会占用存储空间(列存储压缩技巧,除公共除数或者同时减去最小数,字符串压缩的话,直接去重后用数字ID压缩)
- node nvm
- Windows Server 2008 R2 备份与恢复详细实例
- PHP如何得到数组最后元素的key
- BEC listen and translation exercise 49
- 【构建二叉树】01根据前序和中序序列构造二叉树【Construct Binary Tree from Preorder and Inorder Traversal】
- Mybatis学习--日志
- 基于v4l2 ffmpeg x264的视频远程监控(附上编译好的库文件)
- ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)