关于类的加载顺序
最近瞎搞数据结构跟算法,今天把笔记上的这道题顺便理解理解。这是上周在广州阿里的一道笔试题,百度了一下发现很多人上传了代码,也做了一些总结,而我只是做一下笔记,以后回头可以看看复习;
package test.static_;
public class StaticTest {
public static int k = 0;
public static StaticTest t1 = new StaticTest("t1");
public static StaticTest t2 = new StaticTest("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static{
print("静态块");
}
public StaticTest(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
public static void main(String[] args) {
StaticTest t = new StaticTest("init");
}
}
结果:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
先说说这道题结果的流程:
1.加载类的静态属性
这里加载的是:public static int k = 0;
然后加载:public static StaticTest t1 = new StaticTest("t1");
因为此处进行了类的实例化所以
1.1加载类的非静态属性;
这里是:public int j = print("j"); 输出---
1:j i=0 n=0
1.2顺序加载类中的非static代码块(构造块)
这里是:print("构造快"); 输出---
2:构造块 i=1 n=1
1.3加载类的构造方法
这里是:public StaticTest(String str) 输出---
3:t1 i=2 n=2
1.4重复第二个属性加载;
输出---
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
2.继续加载类的静态属性
这里加载的是:public static int i = print("i");输出---
7:i i=6 n=6
3.继续加载类的静态属性
这里加载的是:public static int n = 99;
4.加载static代码块
这里加载的是:static{ print("静态块");}输出---
8:静态块 i=7 n=99
5.主函数main方法加载
这里加载的是:StaticTest t = new StaticTest("init");
输出---
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
结束---------
类的加载顺序(其实理解上面那道题就基本了解了类的加载顺序):
1.加载静态成员/静态代码块(同一个类里的静态成员/代码块,按写代码的顺序加载):
先递归地加载父类的静态成员/代码块(Object的最先);再依次加载到本类的静态成员。
如果其间调用静态方法,则调用时会先运行静态方法,再继续加载。同一个类里调用静态方法时,可以不理会写代码的顺序。
2.加载非静态成员/非静态代码块:(实例块在创建对象时才会被加载,同一个类里的非静态成员/代码块,按写代码的顺序加载)
先递归地加载父类的非静态成员/非静态代码块(Object的最先);再依次加载到本类的非静态成员。同一个类里调用方法时,可以不理会写代码的顺序。
但调用属性时,必须注意加载顺序。一般编译不通过,如果能在加载前调用,值为默认初始值(如:null 或者 0)。
3.调用构造方法:
先递归地调用父类的构造方法(Object的最先)也就是上溯下行;默认调用父类空参的,也可在第一行写明调用父类某个带参的。再依次到本类的构造方法;
------------------------------------------分割线-----------------------------------------------
PS:
“天兔”登陆当天,下午中途翘课赶紧跑大学城,到了华工已经快六点,本来通知是六点开考,但是由于临时试卷不够,被迫等到七点,当时没水没吃晚饭,外面的风渐渐大了,考完9点。对于黑夜,我有一种恐惧感,我找不到方向,陌生的环境,台风天很少学生出来散步,而且很多人都已经走了。随口问了路人甲,BlaBla一堆,发现是一个外国友人(留学生),好吧,考验我的英语口语了,还好,没虚,沿所指方向直走公交站,同等候已久的广工同学(初中同学)一起去广工。考试期间,很多电话打了过来,后来才知道原台风登陆老家,原来姐姐宿舍被台风肆虐,电话还没信号,家里很担心,爸妈一直打电话确保所有人安全才放心,搞得睡觉都不安稳,晚点12点多的时候说联系上了,这才安心睡觉,亲人很重要!
第一次霸笔就这么落魄。 当时试题上讲阿里需要大量java工程师,做出来将会比较大面试机会,哎,基础还是太差了,连面试机会都不给。
分享到:
相关推荐
### Tomcat启动时类加载顺序详解 #### 一、引言 Apache Tomcat是一款开源的Servlet容器,主要用于部署Java Web应用程序。它支持最新的Servlet、JSP等规范,并且以其轻量级、简单易用的特点而受到开发者的青睐。在...
WebSphere应用服务器默认的类加载顺序是先从系统类加载器(System ClassLoader)开始,然后是扩展类加载器(Extension ClassLoader),最后是应用程序类加载器(Application ClassLoader)。这种机制可能导致应用中...
java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System....
在Spring框架中,加载顺序是理解应用程序启动过程的关键部分,涉及到bean的实例化、初始化以及依赖注入等多个环节。本文将详细探讨Spring加载顺序,并结合`@PostConstruct`、`构造方法`以及`@Autowired`等关键注解...
java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序
了解Java中继承关系的加载顺序对于理解和优化程序性能至关重要。以下是对这个主题的详细阐述: 1. 类加载机制 Java的类加载过程分为三个主要阶段:加载、验证、准备、解析和初始化。当一个类被首次引用时(例如...
在Web应用开发中,了解`web.xml`中的监听器(XMLListener)、过滤器(Filter)和Servlet的加载顺序是至关重要的。这些组件是Java Servlet规范的一部分,用于增强和控制Web应用的行为。以下是对这些概念的详细说明: ...
Spring 和 SpringMVC 的配置加载顺序是理解这两个框架协同工作的重要方面。首先,DispatcherServlet 是 SpringMVC 的核心组件,它扮演着请求分发者的角色,确保请求被正确地路由到相应的处理器。DispatcherServlet ...
这些工具可以帮助我们定位类的来源,查看加载顺序,以及优化应用的性能。 标题中的“类加载的工具”可能指的是用于监控和分析类加载过程的各种工具。在Java领域,一些常用的类加载分析工具有: 1. **JVisualVM**:...
可以通过调整类加载顺序、设置类加载器优先级、使用命名空间隔离等手段来解决。 10. **类加载器调试** 为了帮助开发者调试类加载问题,WebLogic提供了详细的日志和跟踪选项,可以通过修改`weblogic.log.File`和`...
类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定的加载顺序。以下是对类加载器原理的详细解释: 1. 类加载器作用: 当JVM启动时,如果需要使用某个类,对应的类加载器会将这个类...
`OrderClassLoaders.java`可能是一个关于类加载顺序控制的示例,展示了如何通过自定义类加载器来决定类的加载顺序。在Windows编程中,类加载顺序可能影响到程序的启动、依赖解析和运行时行为。 综上所述,这个...
在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...
开发者可以通过`-Xbootclasspath`、`-Xbootclasspath/p`和`-Xbootclasspath/a`命令行参数来指定引导类加载器的类路径,从而影响加载顺序或添加额外的类库。 在特殊情况下,如上述示例中的`java -Xbootclasspath/a:...
例如,可以通过修改`common.loader`、`shared.loader`和`context.loader`属性来改变类的加载顺序和来源。 在深入研究"DevLoader"之前,需要查看压缩包内的具体文件,例如org目录下可能包含与DevLoader相关的源代码...
Java继承关系类加载顺序问题详解 在Java中,类加载顺序问题是开发中经常遇到的问题之一。今天,我们来详解Java中继承关系类加载顺序问题,包括类加载顺序、构造方法调用顺序、静态代码块执行顺序等。 首先,让我们...
理解Tomcat的类加载顺序对于避免类加载冲突至关重要。例如,在上述内容中提到了不同版本的`mail.jar`可能导致的`NoSuchProviderException`异常。这是因为Tomcat默认会按照上述顺序查找类,当多个目录下存在相同或...
为了更好地理解这一过程,我们可以创建一个自定义类加载器,并观察加载顺序。通过重写 `findClass()` 方法,我们可以打印出加载类的路径,从而跟踪加载过程。这将显示类是如何按照双亲委派模型逐级传递的。 1.4 ...