装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载。
链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
其中 初始化(initialization)包含两部分:
1.类的初始化(initialization class & interface)---初始化静态变量和静态Java代码块
2.对象的创建(creation of new class instances)----new class()。
用一个简单的流程分析如下:
普通对象初始化 继承体系对象初始化
初始化
1.类的初始化,也就是静态变量以及静态块的初始化
1.1 如果有继承父类有静态变量或者静态块的,先执行初始化。
1.2 如果是final static ,那么就不会初始化类
1.3 如果执行的是父类的静态变量,那么子类不会初始化
public class SuperTmp {
public static int a = 10;
public final static int b = 20;
public int c = 10;
static{
System.out.println("init super calss...");
}
public SuperTmp (){
System.out.println("super init constructor:");
}
}
public class Sub extends SuperTmp {
public static final int aa = 30;
public static int bb = 40;
public int cc = 20;
static {
System.out.println("init sub class.....");
}
public Sub (){
System.out.println("sub init constructor:" );
}
}
public class Play {
public static void main(String[] args) {
/**输出
* init super calss...
* 10
* 不会初始化子类 Sub
*/
System.out.println(Sub.a);
/******
* 输出 b 不会初始化任何类
*/
System.out.println(Sub.b);
/***
* 输出
* init super calss...
* init sub class.....
* 40
*/
System.out.println(Sub.bb);
/*对象初始化
*init super calss...
init sub class.....
*super init constructor
sub init constructor
*/
Sub sb = new Sub()
}
}
2.创建class的对象
2.1.先为Sub类和其父类SuperTmp类分配内存空间,父类和子类的变量都初始化值,对象类型的为null,
基本数据类型的为默认的值,例如 int 类型的为初始化 0
2.2 执行构造函数Sub(), 调用父类的构造函数,输出“super init constructor”,“sub init constructor”。
2.3 初始化superTmp,Sub类的成员变量,并赋值
2.4 对于类实现了接口Interface,初始化它的时候并不会引起接口的初始化。
所以对象的创建,具体步骤如下:
(1) 所有的成员变量—包括该类,及它的父类中的成员变量--被分配内存空间,
并赋予默认值。(第一次初始化成员变量)
(2) 为所调用的构造函数初始化其参数变量。(如果有参数)
(3) 如果在构造函数中用this 调用了同类中的其他构造函数,
则按照步骤(2)~(6)去处理被调用到的构造函数。
(4) 如果在构造函数中用super调用了其父类的构造函数,
则按照步骤(2)~(6)去处理被调用到的父类构造函数。
(5) 按照书写顺序,执行instance initializer 和 instance variable initializer
来初始化成员变量。(第二次初始化成员变量)
(6) 按照书写顺序,执行构造函数的其余部分。
总结:
从类的初始化和对象的创建步骤,可以知道,一个类是先初始化static的变量和static句块,
然后在分配该类以及父类的成员变量的内存空间,赋予默认值,然后开始调用构造函数。
而子类和父类之间,则先初始化和创建父类,然后再初始化和创建子类的。
相关推荐
《Java程序设计基础教程》按内容分成五篇:Java 语言入门篇、面向对象篇、数据流应用篇、Java GUI编程篇和高级应用篇,共有二十四讲组成。
介绍java对象的创建、初始化、和引用。并分析一下JAVA中对象创建和初始化过程中涉及的相关概念问题。
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
NULL 博文链接:https://yuu1987.iteye.com/blog/1113142
java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...
Java中StringBuffer对象的初始化.pdf 学习资料 复习资料 教学资源
通过一个实际问题引入,将源代码转换成JVM字节码后,对JVM执行过程的关键点进行全面解析,并在文中穿插入了相关JVM规范和JVM的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能...
java对象初始化问题
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,网上关于Java中对象初始化顺序的文章很多,这篇文章我们将详细介绍Java中对象初始化顺序。有需要的可以参考学习。
ComplexNumber(double r,double i):构造函数,创建复数对象的同时完成复数的实部、虚部的初始化,r为实部的初值,i为虚部的初值。 getRealPart():获得复数对象的实部。 getImaginPart():获得复数对象的虚部。 ...
Java 的初始化问题和其他高级语言类似。一个明显不一样的地方是体现在它的类加 载过程。传统的编程语言包括C++等,程序是作为启动过程的一部分立刻被加载,而Java 的 类加载只在需要使用程序代码时才会被加载(每个...
当一个类被加载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再被引用、即已经不可触及的时候,Class对象的生命周期结束。那么该类的方法区内的数据也会被卸载,从而结束该类的生命周期。一个类...
“礼让”原则学习Java对象初始化顺序
Java对象初始化的多维度分析 (2).pdf
Java对象的创建与初始化.docx
Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。单元测试的利器。
java对象的初始化顺序[参考].pdf
Java中创建初始化对象.pdf 学习资料 复习资料 教学资源
本文对Java如何执行对象的初始化做一个详细深入地介绍。有需要的小伙伴们可以参考。
1:虚拟机加载OOPDemo类(省略详细加载过程(装载、链接、初始化)),提取类型信息(具体保存哪些类型信息查看博文:Java虚拟机体系结构),存储到方法区中,对应图中的绿色矩形区域。 2:通过保存在方法区的字节...