类初始化顺序,及获取资源
程序员文章站
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
比如
这里new出来的Cat是一个instance
通过
或者
得到的是Class
通过
得到的是ClassLoader
在Class和ClassLoader上都定义了getResourceAsStream()方法,通过这个方法,都可以加载一个资源,并返回InputStream
区别在于,Class.getResourceAsStream()是从当前包路径开始查找,而ClassLoader.getResourceAsStream()是从classpath开始查找
详见这篇帖子[url]http://kyfxbl.iteye.com/blog/1757101[/url]
这些都是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]