`

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

阅读更多
最近在读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
分享到:
评论

相关推荐

    类初始化顺序示例讲解

    ### 类初始化顺序详解 本文将基于给定的Java示例代码深入探讨类初始化的顺序问题。这不仅是Java语言的关键特性之一,在其他面向对象语言(如C++、.NET)中也有相似的概念。理解这一概念有助于程序员更好地掌握面向...

    易语言线程初始化

    在易语言中,线程初始化是一个关键的概念,它涉及到多任务并行处理,使得程序能够同时执行多个不同的任务,提高系统的效率。 线程是操作系统分配CPU时间的基本单位,一个进程可以包含一个或多个线程。在易语言中,...

    内核初始化

    内核初始化的第一步是设置控制流,即确定内核启动后执行的顺序和流程。这个过程通常包括以下几个步骤: - **设置栈**: 初始化栈空间,为内核函数调用做准备。 - **设置中断**: 禁止或允许中断,根据需要配置中断向...

    探讨Struts的初始化方法

    ### Struts框架初始化详解 #### 一、Struts框架简介 Struts是一个开源的MVC(Model-View-Controller)架构实现,用于简化Java Web应用的开发过程。它基于Servlet和JSP技术来构建Web应用程序,能够帮助开发者更加...

    模板类实现顺序表基本操作

    - 构造函数:初始化顺序表。 - 析构函数:释放顺序表所占用的资源。 - `Insert`:在指定位置插入新元素。 - `GetLength`:返回顺序表中的元素个数。 - `SLCreat`:创建顺序表。 - `Del`:删除指定位置的元素。...

    Flex启动与初始化

    下图为 swf 初始化的顺序: 1. SystemManager 2. 加载器 3. Application 二、SystemManager 的作用 SystemManager 是 Flex 发布 swf 的文档类,是应用程序的入口。它不仅控制 swf 的加载和启动,还划分 Flex 工程...

    SpringBoot项目启动时如何读取配置以及初始化资源

    在SpringBoot项目中,配置文件的读取和资源的初始化是关键步骤,它们确保应用程序能够根据设定的参数正确地启动和运行。以下是对这两种技术的详细说明。 首先,SpringBoot项目通常使用YAML或properties格式的配置...

    C8051F020单片机初始化程序和编译步骤.doc

    编写初始化程序时,应确保每个模块都按照正确的顺序和设置进行初始化,以确保系统稳定可靠地运行。同时,注意对异常处理和电源管理的设置,以增强系统的稳定性和适应性。在编译过程中,选择合适的编译器和优化级别也...

    jquery初始化分析

    此外,`jQuery.fn.init`是jQuery的核心初始化函数,它接收一个选择器作为参数,用于获取DOM元素。在这个函数中,会进行一系列的检查和处理,最终返回一个jQuery对象,这个对象包含了匹配的选择器的所有DOM元素。 ##...

    oracle初始化参数学习

    ### Oracle 初始化参数详解 #### 一、Oracle 初始化参数概述 Oracle 数据库的初始化参数是用于配置数据库实例在启动时所采用的各种设置。这些参数对于控制数据库的行为至关重要,包括内存分配、进程数量、文件路径...

    java类加载知识点整理

    - 接口在初始化时并不要求父接口全部完成初始化,这意味着接口的初始化顺序可能会有所不同。 #### 三、类初始化时机 根据虚拟机规范,类的初始化仅在某些特定情况下发生。例如,创建一个新对象或调用静态方法时,...

    顺序表的C++程序实现

    - **构造函数**:根据传入的参数初始化顺序表。 - **析构函数**:释放分配给顺序表的内存。 - **CreateList**:创建一个包含指定数量元素的顺序表。 - **SLIsEmpty**:判断顺序表是否为空。 - **SLIsFull**:判断...

    顺序表的实现

    - **带参数构造函数** `SeqList(DataType a[], int n)` 接收一个整型数组和其长度作为参数,用于初始化顺序表。 - **析构函数** `~SeqList()` 释放资源,此处未做具体操作。 - **获取顺序表长度** `int Length()` ...

    Videoreader_matlab中_VideoReader类的函数_VideoReader_

    首先,我们创建一个VideoReader对象来初始化对视频文件的访问。这可以通过调用VideoReader函数并传入视频文件的路径来实现。例如: ```matlab vid = VideoReader('video.mp4'); ``` `vid`现在包含了视频的基本信息,...

    web.xml加载顺序与web.xml常用节点解析

    - `<context-param>`的值可以在监听器的`contextInitialized(ServletContextEvent)`方法中获取,此时可以利用这些参数进行初始化操作,例如设置数据库连接。 2. **节点解析**: - `<filter>`和`<filter-mapping>`...

    顺序表案例-Stat.zip

    1. 初始化:创建一个空的顺序表,可以设置初始容量,如10,也可以根据需要动态分配。 2. 插入元素:在指定位置插入一个元素,需要检查当前表是否已满,如果满则需要进行扩容操作(如将容量翻倍)。 3. 删除元素:...

    ShunDaoXingWeixin:初始化

    当类被加载时,静态块会按顺序执行,用于初始化静态变量。而对象的实例化则会调用构造函数,确保每个实例都有正确的初始状态。 此外,线程池、定时任务、日志系统等也常常在初始化阶段配置。例如,使用`java.util....

    C++实现顺序表-已运行成功

    - `SeqList(T a[], int n)`:有参构造函数,接受一个类型为`T`的数组`a`和一个整型变量`n`作为参数,用于初始化顺序表。 - `~SeqList(){};`:析构函数,释放顺序表占用的资源。 ##### 2.3 常用操作 ```cpp void ...

Global site tag (gtag.js) - Google Analytics