Java类的加载顺序
2016-05-25 18:10
295 查看
问题
昨天有人问我一个类中有静态方法,有静态代码块,普通代码块,构造函数,普通方法,静态方法,那么它们的加载顺序是什么?如果有之类继承该类,也有如上的方法,那么加载顺序又是如何?
实例1
普通方法StaticVar[java] view
plain copy
package org.andy.test;
/**
* @author andy
* @version:2015-2-4 上午10:52:32
*
*
*/
public class StaticVar {
public StaticVar() {
System.out.println("----StaticVar-----");
}
}
测试加载方法OrderLoad
[java] view
plain copy
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();
}
}
运行结果如下:
加载顺序是:
静态代码块-----静态方法--------普通代码块-------构造方法-----------调用的方法(包括静态方法和非静态方法,按调用顺序)
实例2
子类OrderLoadChild实现父类OrderLoad[java] view
plain copy
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();
}
}
运行结果如下:
加载顺序是:
父类静态块-----父类静态常量-------子类静态块----------子类静态常量----------父类普通代码块------------父类构造方法------------子类代码块------------子类构造方法
类的加载顺序
1、静态代码块/静态成员
静态代码块/静态成员最先加载。静态代码块/静态成员顺序按照代码书写先后顺序加载。
如父类有静态代码块/静态成员,先调用父类静态代码块/静态成员(Object最优先),再一次加载本类的静态代码块/静态成员。
2、普通代码块/非静态成员
同一类中普通代码块/非静态成员顺序在静态代码块/静态成员加载之后。同一类中多段普通代码块/非静态成员加载顺序按照代码书写先后加载。
如父类有普通代码块/非静态成员,现在加载父类的普通代码块/非静态成员,在加载子类的普通代码块/非静态成员。
3、构造方法
同一类中构造方法次于代码块之后加载。同一类中如果有多个构造方法,按照实例时所调用的加载。
先加载父类的构造方法,在加载子类的构造方法。
子类的普通代码块/非静态成员加载顺序低于父类构造函数的加载顺序。
4、静态方法/普通方法
调用时才加载。
总结:
先加载父类的静态代码块/静态成员(父类中中都有或有多个有,按书写顺序) ------------- 加载子类的静态代码块/静态成员(字类中都有或有多个,按书写顺序)---------父类的普通代码块/非静态成员(父类中中都有或有多个有,按书写顺序)------------父类的构造方法-----------------子类的普通代码块/非静态成员(字类中都有或有多个,按书写顺序)-----------子类的构造方法
相关文章推荐
- spring+mybatis+uncode-dal实现数据库读写分离
- Java基础---多线程
- leetcode03-Longest Substring Without Repeating Characters之Java版本
- Spring 学习第一天
- ActiveMQ使用步骤--- 开发测试环境搭建及Java用例
- spring整合mybatis
- eclipse设置代码自动补全
- Java下利用Jackson进行JSON解析和序列化
- JAVA中的枚举类型
- (java)Leetcode-15. 3Sum
- JAVA中的反射机制
- JAVA 笔记(三) 从源码深入浅出集合框架
- Struts2_类型转换错误消息的显示和定制
- RxJava介绍
- java 上传文件到七牛云存储的demo
- 【第九章】 Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3
- Java面向对象经典总结
- Java程序的初始化顺序
- X的N次方 朴素分治法-Java
- java多线程调用run和不调用run的区别