A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 only-hou 于 2016-1-29 14:12 编辑

哪位大神知道。全面一点的(包括静态代码块,代码块那些)

3 个回复

倒序浏览
静态代码块随着类的加载而加载,构造代码块在构造方法执行前先执行.
回复 使用道具 举报
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
回复 使用道具 举报 1 0
本帖最后由 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



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马