码迷,mamicode.com
首页 > 编程语言 > 详细

Java 静态块、构造方法加载顺序

时间:2017-12-30 18:17:54      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:cto   实例化   oid   stat   const   div   system   执行   pos   


package cn.lay.Test;

/**
* Created by lay on 2017/12/30.
*/
public class Test {
public static void main(String[] args) {
new C();
}
}


class A{
static {
System.out.println("A static");
}

{
System.out.println("A");
}

public A() {
System.out.println("A constructor");
}
}

class B extends A{
static {
System.out.println("B static");
}

{
System.out.println("B");
}

public B() {
System.out.println("B constructor");
}
}

class C extends B{
static {
System.out.println("C static");
}

{
System.out.println("C");
}

public C() {
System.out.println("C constructor");
}
}
 

C 继承自 B,B 继承自 A;ABC分别有静态域和构造方法,执行main方法结果如下:

A static
B static
C static
A
A constructor
B
B constructor
C
C constructor

我们看到,先按照继承顺序加载了ABC静态域,再按照继承顺序加载了非静态的;

由此,加载顺序其实是由生命周期,以及依赖顺序决定的;

1、先静态域加载;后构造方法加载;

2、先加载父类,后加载子类;

3、构造方法最晚;

为什么不能先加载子类?

因为子类继承了父类,假设子类需要使用父类的变量或者方法,父类此时却还未实例化,那么程序将出错;

为什么不能先加载构造方法?

简单地说,如果非静态方法使用静态变量,这时候静态域却没有执行,那静态变量的值就出错了。

Java 静态块、构造方法加载顺序

标签:cto   实例化   oid   stat   const   div   system   执行   pos   

原文地址:https://www.cnblogs.com/lay2017/p/8150536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!