文档章节

Java之对象构造过程

思想永无止境
 思想永无止境
发布于 2016/11/04 11:58
字数 823
阅读 7
收藏 0


Java中一个对象的构造过程如下:


1-6属于初始化静态部分,如果一个类的静态部分已经初始化了(已经被类加载器加载了),就不会再重复初始化静态部分,静态部分的初始化只会在类加载器加载一个类的时候初始化一次


1.用类加载器加载父类,按父类静态变量定义的顺序的为父类所有静态变量分配空间,并赋予父类静态变量默认值。

2.用类加载器加载自己,按自己静态变量定义的顺序的为自己所有静态变量分配空间,并赋予自己静态变量默认值。


3.按父类静态变量定义的顺序的为父类所有静态变量赋上定义的值。

4.执行父类静态代码块。


5.按自己静态变量定义的顺序的为自己所有静态变量赋上定义的值。

6.执行自己静态代码块。


7-14属于初始化实例部分。


7.为父类实例变量分配空间,并赋予默认值。

8.为自己实例变量分配空间,并赋予默认值。


9.按父类实例变量定义的顺序的为父类所有实例变量赋上定义的值。

10.执行父类的构造代码块。

11.执行父类的构造方法。


12.按自己实例变量定义的顺序的为自己所有实例变量赋上定义的值。

13.执行自己的构造代码块。

14.执行自己的构造方法。


对象构造完成!


注意:

1.父类如果还有父类就也依照此顺序先初始化父类的父类,直到Object为止。


2.如果执行步骤3、5、9、12时,定义的值引入了别的类,则会初始化那个类,如果引用的类还有引用的类则也按照此顺序先初始化引用类的引用类,直到所有被引用的类全部被初始化完毕为止。


3.如果一个类没有父类(如Object类),则它的初始化顺序可以简化成2、5、6、8、12、13、14。


4.如果这个类已经被类加载器加载过了,也就是该类的静态部分已经初始化过了,那么1、2、3、4、5、6都不会执行,总的顺序可以简化为7、8、9、10、11、12、13、14。


5.如果这个类没有被类加载器加载,但它的父类已经被类加载器加载过了,那么总的顺序可以简化为2、5、6、7、8、9、10、11、12、13、14。


执行以下代码:

public class A {
	public A() {
		init();
	}
	public void init() {
		
	}
	public static void main(String[] args) {
		B b = new B();
		System.out.println("最终i的值为:" + b.i + ",j的值为:" + b.j);
	}
}
class B extends A {
	int i;
	int j = 999;
	public void init() {
		System.out.println("此时A的构造方法正在调用此方法:i的值为:" + i + ",j的值为:" + j);
		i = 888;
		j = 111;
	}
}

打印结果:

此时A的构造方法正在调用此方法:i的值为:0,j的值为:0
最终i的值为:888,j的值为:999



转载请标明原地址,请尊重原创,谢谢。

© 著作权归作者所有

上一篇: Web开发记录
思想永无止境
粉丝 4
博文 257
码字总数 292814
作品 0
昌平
程序员
私信 提问
两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义
2018/06/12
0
0
两道面试题,带你透彻解析Java类加载机制

  在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:   class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Gran...

java进阶架构师
2018/12/06
0
0
阿里P8技术心得:java反射机制的核心原理

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构
2018/11/25
0
0
Java编程中那些再熟悉不过的知识点(持续更新)

本文来自于我的慕课网手记:Java编程中那些再熟悉不过的知识点,转载请保留链接 ;) 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 4. Oracl...

小码哥的freestyle
04/11
0
0
JVM系列第7讲:JVM 类加载机制

当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析、运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制。JVM 虚拟机执行 class 字节码的过...

陈树义
2018/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
80
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部