面试题——main方法之前干了什么

xiaoxiao2021-02-28  40

先上一段代码

package _Draft; public class test { public static int k = 0; public static test t1 = new test("t1"); public static test t2 = new test("t2"); public static int i = print("i"); public static int n = 99; static { print("静态块"); System.out.println(k); System.out.println(t1); System.out.println(t2); System.out.println(i); System.out.println(n); System.out.println("step2"); } public int j = print("j"); { System.out.println("step4"); print("构造块"); } public test(String str) { System.out.println((++j) + ":" + str + " i=" + i + " n=" +n); ++i; ++n; System.out.println(); } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++n; System.out.println(); return ++i; } public static void main(String args[]) { test t = new test("init"); } }

这道面试题的难点在于在main方法之前,程序都干什么了?

无从下手?我们先看看结果

1:j i=0 n=0 step4 2:构造块 i=1 n=1 2:t1 i=2 n=2 3:j i=3 n=3 step4 4:构造块 i=4 n=4 5:t2 i=5 n=5 5:i i=6 n=6 6:静态块 i=7 n=99 6 _Draft.test@15db9742 _Draft.test@6d06d69c 8 100 step2 7:j i=8 n=100 step4 8:构造块 i=9 n=101 10:init i=10 n=102

先说我的结论:

首先知道一点,static修饰的变量、方法属于类,其他(非static,静态块)属于对象,属于类的在加载的时候初始化一次,属于对象的在new或者其他方式新建对象时初始化。对象初始化的时候首先初始化变量、构造块然后才是构造方法。也就是说构造块的执行次序优先于类构造函数。另外补充一句,属于类的东西,可以让所有对象共有。

第二点,在执行main方法之前可以新建对象。

下面是真的结论:(在内存中时如何的这里就不讨论了,但是如果知道的话,这里就会更清楚)

第一步,在类加载的时候,首先将static修饰的变量,由上到下依次加载到内存,并且赋默认值,注意是默认值不是初值,依照

不同的类型赋值。然后将static修饰的方法,加载到一个叫方法区的地方。(这一步我称为装载,不知道专业人士怎么叫的)

这一步很重要,否则你会不知道为什么面试题中n的值从6突然变到99。

第二步,static由上到下初始化。

第三步,初始化非static成员变量/构造块 由上到下

第四步,执行构造函数

第五步,执行主函数

好,让我们照着面试题捋一捋。

第一步,装载到内存

k=0 t1=null t2=null i=0 n=0

然后初始化

k=0,没有问题。

t1此时new了一个对象,new对象的时候,初始化非static部分,也就是23行往下。执行print("j"),所以打印

1:j i=0 n=0

这里k是初始化后的0执行++k后的结果。而i和n均是装载的时候的默认值。

继续执行25到28行构造块,打印

step4 2:构造块 i=1 n=1

这里要补充一点,构造块和成员变量也是依据位置来初始化的。可以将22行移到27行下面观看输出结果。

接着执行构造函数

2:t1 i=2 n=2

这时t1的初始化就完成了,接着初始化t2,这个和t1一样,只是k、i、n的值在变化,注意这时i和n仍没有初始化。

接着执行第7行,初始化i,输出

5:i i=6 n=6

接着执行第8行,初始化n,此时n变为99。

接着回到了第二步,初始化静态块,输出

6:静态块 i=7 n=99 6 _Draft.test@15db9742 _Draft.test@6d06d69c 8 100 step2

此时n为100,也没有问题了。

此时初始化就完成了,接着执行main方法就没有什么难点了。

总结,这道面试题主要难点在于1.static装载的时候赋需要默认值。2.static变量用new对象来赋值的是完全可以的,也就是在main方法之前,可以new对象。

转载请注明原文地址: https://www.6miu.com/read-2623873.html

最新回复(0)