欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-08 19:39:10
...
最近在读tomcat的源码,涉及到各种类继承体系的初始化,还有资源加载

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

一、类继承体系的初始化

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

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

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

3、父类的字段初始化

4、父类的构造方法执行

5、子类的字段初始化

6、子类的构造方法执行

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

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

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

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

二、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开始查找
详见这篇帖子[url]http://kyfxbl.iteye.com/blog/1757101[/url]