java程序的加载顺序_Java类的加载顺序

问题

昨天有人问我一个类中有静态方法,有静态代码块,普通代码块,构造函数,普通方法,静态方法,那么它们的加载顺序是什么?如果有之类继承该类,也有如上的方法,那么加载顺序又是如何?

实例1

普通方法StaticVar

package org.andy.test;

/**

* @author andy

* @version:2015-2-4 上午10:52:32

*

*

*/

public class StaticVar {

public StaticVar() {

System.out.println("----StaticVar-----");

}

}

测试加载方法OrderLoad

package org.andy.test;

/**

* @author andy

* @version:2015-2-4 上午10:33:48

*

*

*/

public class OrderLoad {

static{

System.out.println("----OrderLoad静态代码块-----");

}

private static StaticVar staticVar = new StaticVar();

{

System.out.println("----OrderLoad代码块-----");

}

public OrderLoad(){

System.out.println("----OrderLoad构造函数-----");

System.out.println(" ");

}

public static void staticFunction(){

System.out.println("----OrderLoad静态方法-----");

}

public void normalFunction(){

System.out.println("----OrderLoad普通方法-----");

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

OrderLoad staticVar = new OrderLoad();

OrderLoad.staticFunction();

staticVar.normalFunction();

}

}

运行结果如下:

0818b9ca8b590ca3270a3433284dd417.png

加载顺序是:

静态代码块-----静态方法--------普通代码块-------构造方法-----------调用的方法(包括静态方法和非静态方法,按调用顺序)

实例2

子类OrderLoadChild实现父类OrderLoad

package org.andy.test;

/**

* @author andy

* @version:2015-2-4 上午11:33:51

*

*

*/

public class OrderLoadChild extends OrderLoad {

static {

System.out.println("----OrderLoadChild静态代码块-----");

}

private static StaticVar staticVar = new StaticVar();

{

System.out.println("----OrderLoadChild代码块-----");

}

public OrderLoadChild(){

System.out.println("----OrderLoadChild构造函数-----");

System.out.println(" ");

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

OrderLoadChild orderLoadChild = new OrderLoadChild();

}

}

运行结果如下:

0818b9ca8b590ca3270a3433284dd417.png

加载顺序是:

父类静态块-----父类静态常量-------子类静态块----------子类静态常量----------父类普通代码块------------父类构造方法------------子类代码块------------子类构造方法

类的加载顺序

1、静态代码块/静态成员

静态代码块/静态成员最先加载。

静态代码块/静态成员顺序按照代码书写先后顺序加载。

如父类有静态代码块/静态成员,先调用父类静态代码块/静态成员(Object最优先),再一次加载本类的静态代码块/静态成员。

2、普通代码块/非静态成员

同一类中普通代码块/非静态成员顺序在静态代码块/静态成员加载之后。

同一类中多段普通代码块/非静态成员加载顺序按照代码书写先后加载。

如父类有普通代码块/非静态成员,现在加载父类的普通代码块/非静态成员,在加载子类的普通代码块/非静态成员。

3、构造方法

同一类中构造方法次于代码块之后加载。

同一类中如果有多个构造方法,按照实例时所调用的加载。

先加载父类的构造方法,在加载子类的构造方法。

子类的普通代码块/非静态成员加载顺序低于父类构造函数的加载顺序。

4、静态方法/普通方法

调用时才加载。

总结:

先加载父类的静态代码块/静态成员(父类中中都有或有多个有,按书写顺序) -------------  加载子类的静态代码块/静态成员(字类中都有或有多个,按书写顺序)---------父类的普通代码块/非静态成员(父类中中都有或有多个有,按书写顺序)------------父类的构造方法-----------------子类的普通代码块/非静态成员(字类中都有或有多个,按书写顺序)-----------子类的构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值