类初始化顺序,及获取资源

最近在读tomcat的源码,涉及到各种类继承体系的初始化,还有资源加载

这些都是JAVA语言里最基础的东西,但是做应用开发的时候,往往很少涉及到。也是最近看源码,才感觉有些模糊,在这里总结一下

一、类继承体系的初始化

子类Son继承父类Parent,当实例化一个Son类的对象时,整个初始化顺序是这样的:

1、父类的所有静态初始化,包括静态字段,和static块,按照代码书写顺序执行

2、子类的所有静态初始化,包括静态字段,和static块,按照代码书写顺序执行

3、父类的字段初始化

4、父类的构造方法执行

5、子类的字段初始化

6、子类的构造方法执行

总的来说,就是“先静态后实例、先父类后子类、先字段后构造方法”

在另外一篇博客 http://developer.51cto.com/art/201303/382984.htm里,看到这样一段话:

“java编译器在编译产生字节码的时候,将父类的构造函数、域的初始化、代码块的执行和子类自己的构造函数按照顺序组合在了一起,形成了新的构造函数”

以下这篇帖子也总结得比较全面: http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html

二、getResourceAsStream

首先明确以下3个概念“对象实例”、“类”、“类加载器”,在代码里就是instance、Class、ClassLoader

比如
Cat cat = new Cat();

这里new出来的Cat是一个instance

通过
cat.getClass();

或者
Cat.class

得到的是Class

通过
cat.getClass().getClassLoader();

得到的是ClassLoader

在Class和ClassLoader上都定义了getResourceAsStream()方法,通过这个方法,都可以加载一个资源,并返回InputStream

区别在于,Class.getResourceAsStream()是从当前包路径开始查找,而ClassLoader.getResourceAsStream()是从classpath开始查找
详见这篇帖子 http://kyfxbl.iteye.com/blog/1757101

你可能感兴趣的:(初始化)