关于类的加载顺序

[color=red][size=large]关于类的加载顺序[/size][/color]
最近瞎搞数据结构跟算法,今天把笔记上的这道题顺便理解理解。这是上周在广州阿里的一道笔试题,百度了一下发现很多人上传了代码,也做了一些总结,而我只是做一下笔记,以后回头可以看看复习;

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");
}
}
[color=green]结果:
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[/color]
[color=red][size=medium]先说说这道题结果的流程:[/size][/color]
[size=medium][color=red]1.加载类的静态属性[/color][/size]
这里加载的是:public static int k = 0;
然后加载:public static StaticTest t1 = new StaticTest("t1");
因为此处进行了类的实例化所以
[b]1.1加载类的非静态属性;[/b]
这里是:public int j = print("j"); 输出---[color=green]1:j i=0 n=0[/color]
[b]1.2顺序加载类中的非static代码块(构造块)[/b]
这里是:print("构造快"); 输出---[color=green]2:构造块 i=1 n=1[/color]
[b]1.3加载类的构造方法[/b]
这里是:public StaticTest(String str) 输出---[color=green]3:t1 i=2 n=2[/color]
[b]1.4重复第二个属性加载;[/b]
输出---
[color=green] 4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5[/color]
[size=medium][color=red]2.继续加载类的静态属性[/color][/size]
这里加载的是:public static int i = print("i");输出---[color=green]7:i i=6 n=6[/color]
[color=red][size=medium]3.继续加载类的静态属性[/size][/color]
这里加载的是:public static int n = 99;
[color=red][size=medium]4.加载static代码块[/size][/color]
这里加载的是:static{ print("静态块");}输出---[color=green]8:静态块 i=7 n=99[/color]
[color=red][size=medium]5.主函数main方法加载[/size][/color]
这里加载的是:StaticTest t = new StaticTest("init");
输出---[color=green]9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102[/color]
[size=medium][color=brown]结束---------[/color][/size]

[size=medium][b]类的加载顺序(其实理解上面那道题就基本了解了类的加载顺序):[/b][/size]
[color=red]1.加载静态成员/静态代码块(同一个类里的静态成员/代码块,按写代码的顺序加载):[/color]
先递归地加载父类的静态成员/代码块(Object的最先);再依次加载到本类的静态成员。
如果其间调用静态方法,则调用时会先运行静态方法,再继续加载。同一个类里调用静态方法时,可以不理会写代码的顺序。
[color=red]2.加载非静态成员/非静态代码块:(实例块在创建对象时才会被加载,同一个类里的非静态成员/代码块,按写代码的顺序加载)[/color]
先递归地加载父类的非静态成员/非静态代码块(Object的最先);再依次加载到本类的非静态成员。同一个类里调用方法时,可以不理会写代码的顺序。
但调用属性时,必须注意加载顺序。一般编译不通过,如果能在加载前调用,值为默认初始值(如:null 或者 0)。
[color=red]3.调用构造方法:[/color]
先递归地调用父类的构造方法(Object的最先)也就是上溯下行;默认调用父类空参的,也可在第一行写明调用父类某个带参的。再依次到本类的构造方法;
[color=brown]------------------------------------------分割线-----------------------------------------------[/color]
PS:[size=medium]“天兔”[/size]登陆当天,下午中途翘课赶紧跑大学城,到了华工已经快六点,本来通知是六点开考,但是由于临时试卷不够,被迫等到七点,当时没水没吃晚饭,外面的风渐渐大了,考完9点。对于黑夜,我有一种恐惧感,我找不到方向,陌生的环境,台风天很少学生出来散步,而且很多人都已经走了。随口问了路人甲,BlaBla一堆,发现是一个外国友人(留学生),好吧,考验我的英语口语了,还好,没虚,沿所指方向直走公交站,同等候已久的广工同学(初中同学)一起去广工。考试期间,很多电话打了过来,后来才知道原台风登陆老家,原来姐姐宿舍被台风肆虐,电话还没信号,家里很担心,爸妈一直打电话确保所有人安全才放心,搞得睡觉都不安稳,晚点12点多的时候说联系上了,这才安心睡觉,亲人很重要!
第一次霸笔就这么落魄。 当时试题上讲阿里需要大量java工程师,做出来将会比较大面试机会,哎,基础还是太差了,连面试机会都不给。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值