Java类的加载及初始化顺序
2015-10-23 11:21
477 查看
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题。从网上查阅了若干文章,现总结如下。
我们通过一段代码来了解类加载和初始化的顺序:
本程序的运行结果如下:
首先,当我们运行此程序的时候,主线程启动,编译器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以编译器开始去加载insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化),所以此时打印出了 static Insect.x1 initialized, 当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized;
到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。
这时候执行System.out.println(“Beetle constructor”);所以打印出:Beetle constructor;
下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;
在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println(“i = ” + i + “, j = ” + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;
当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,o(∩_∩)o…哈哈程序的结构分析完了。
值得注意的是:静态成员初始化是从最顶层的类开始的,因为子类成员的初始化可能回用到基类的成员。
所以类加载以及初始化的顺序是:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->类初始化{类非静态成员的初始化,然后执行构造器(有父类的先给父类的非静态成员初始化,然后父类的构造器)}
参考来源:/article/9564971.html
我们通过一段代码来了解类加载和初始化的顺序:
class Insect { private int i = 9; protected int j; Insect(){ System.out.println("i = " + i + ", j = " + j); j = 39; } private int p = print("Insect.p initialized"); private static int x1 = print("static Insect.x1 initialized"); static int print(String s) { System.out.println(s); return 47; } } public class Beetle extends Insect { private int k = print("Beetle.k initialized"); public Beetle() { System.out.println("k = " + k); System.out.println("j = " + j); } private static void dd() { System.out.println("dd "); } private static int x2 = print("static Beetle.x2 initialized"); public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle b = new Beetle(); } }
本程序的运行结果如下:
static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor Insect.p initialized i = 9, j = 0 Beetle.k initialized k = 47 j = 39
首先,当我们运行此程序的时候,主线程启动,编译器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以编译器开始去加载insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化),所以此时打印出了 static Insect.x1 initialized, 当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized;
到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。
这时候执行System.out.println(“Beetle constructor”);所以打印出:Beetle constructor;
下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;
在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println(“i = ” + i + “, j = ” + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;
当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,o(∩_∩)o…哈哈程序的结构分析完了。
值得注意的是:静态成员初始化是从最顶层的类开始的,因为子类成员的初始化可能回用到基类的成员。
所以类加载以及初始化的顺序是:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->类初始化{类非静态成员的初始化,然后执行构造器(有父类的先给父类的非静态成员初始化,然后父类的构造器)}
参考来源:/article/9564971.html
相关文章推荐
- 内存配置参数的含义 JDK和MyEclipse
- java基础
- java线程池和队列分析
- struts2的Tiles管理页面
- JavaWeb-JSP脚本中的9个内置对象
- The connection to adb is down, and a severe error has occured.You must restart adb and Eclipse.
- jps命令使用
- java中File类
- java笔试题
- Java数组的基本学习教程
- java1.8--1.8入门介绍
- java1.8--1.8入门介绍
- JAVA EL表达式详细介绍使用手册
- java常用术语
- Spring之——SpringMVC配置详解
- Java语言基础之super关键字
- Java中的享元(flyweight)设计模式
- 用java字节码解释i++和++i(转)
- spring第一课,beans配置(上)
- hadoop1 eclipse插件编译