黑马程序员技术交流社区

标题: Java类的加载顺序是什么啊??? [打印本页]

作者: only-hou    时间: 2016-1-27 23:15
标题: Java类的加载顺序是什么啊???
本帖最后由 only-hou 于 2016-1-29 14:12 编辑

哪位大神知道。全面一点的(包括静态代码块,代码块那些)
作者: life55    时间: 2016-1-27 23:40
静态代码块随着类的加载而加载,构造代码块在构造方法执行前先执行.
作者: 纤路    时间: 2016-1-27 23:50
2,遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存  父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载  第一个输出,静态代码块Fu,第二个输出静态代码块Zi  3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,但是在执行  父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的所以  第三个输出构造代码块Fu,第四个输出构造方法Fu  4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
作者: dele    时间: 2016-1-28 01:05
本帖最后由 dele 于 2016-1-28 01:24 编辑

1.加载父类.class文件,再加载子类.class文件。加载进内存会执行static代码块
2.new 分配堆空间,进行默认初始化
3.调用子类构造函数
4.构造函数中通过super()调用父类构造函数(super()一定是第一条)
5.执行父类的显示初始化
6.执行父类的构造代码块
7.执行父类构造函数中的初始化操作
8.执行子类的显示初始化
9.执行子类的构造代码块
10.执行子类构造函数中的初始化操作
测试代码如下:
public class Test{
        int age = 8;
        static {
                System.out.println("Test static run");
        }
        
        {
                System.out.println("Test run");
                System.out.println("Test run" + age);
        }
        
        public Test() {
                System.out.println("Test con");
                age = 9;
                System.out.println("Test con" + age);
        }
        
        public static void main(String[] args) {
                Demo d = new Demo();
               
        }

}

class Demo extends Test {
        static {
                System.out.println("Demo static run");
        }
        
        {
                System.out.println("Demo run");
        }
        public Demo() {
                System.out.println("Demo con");
        }
}

运行结果:
Test static run
Demo static run
Test run
Test run8
Test con
Test con9
Demo run
Demo con








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2