面試題 main方法之前幹了什麼

2021-08-18 10:59:55 字數 2211 閱讀 8694

先上一段**

package  _draft;

public class test

public int j = print("j");

public test(string str)

public static int print(string str)

public static void main(string args)

}

這道面試題的難點在於在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

8100

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=0n=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

8100

step2

此時n為100,也沒有問題了。

此時初始化就完成了,接著執行main方法就沒有什麼難點了。

總結,這道面試題主要難點在於1.static裝載的時候賦需要預設值。2.static變數用new物件來賦值的是完全可以的,也就是在main方法之前,可以new物件。

面試題 程式在啟動之前都做了什麼?

這個過程中,都做了什麼呢?第一階段 預處理 preprocessing 編譯器 compiler 彙編器 assembler 生成mach o檔案 第二階段 讀取mach o檔案,載入dylb linker 初始化runtime loader 第三階段 呼叫main函式 第四階段 首屏渲染第一階段分...

LeetCode面試題之前序遍歷

給定乙個二叉樹,返回它的 前序 遍歷。示例 輸入 1,null,2,3 12 3輸出 1,2,3 前序遍歷 根節點 左子樹 右子樹 思路 1 2 31 3 5 6 6 77 9 0 棧stack 先進後出 堆heap 先進先出 1 本質 stack是乙個容器 實現了棧的先進後出的特點。2 標頭檔案 ...

面試題彙總 排序方法

氣泡排序,選擇排序,快速排序,插入排序,基數排序,桶排序 依次比較相鄰的兩個數,將小數放在前面,大數放在後面 氣泡排序,具有穩定性 時間複雜度為o n 2 public class main system.out.print 排序前的陣列為 for int i sort system.out.pri...