關於java物件初始化的一點有意思的東西

2021-06-29 12:13:20 字數 1731 閱讀 2055

這篇文章實際的內容並沒有多少,或者說對實際程式設計影響並不大,主要是為了可能的筆試面試之類的,還有就是有點好玩而已。

有一天我在書上看到很有意思的**:

class a

static

public a()

}class b extends a

static

public b()

}class c extends b

static

public c()

}public class forblogtest

}

你假如已經知道他的輸出了,那麼可以不用看這篇文章了。以下是他的輸出結果。

下面我就來解釋以下,當然這是建立在我對jvm還沒有深入了解的基礎上討論的,相信不就後,我會站在那個角度來對他進行解釋。

首先輸出的是a的靜態初始塊,為什麼,我們可以把這個問題分解為兩個。1,為什麼輸出靜態初始塊; 2,為什麼先輸出a 。

那第二個問題呢:因為在初始乙個對物件的時候,編譯器會先找到它的父類,並先呼叫他的初始化操作,所以可以得到,每次初始乙個物件是,最先呼叫的是object的初始化操作。

那麼又為什麼是先輸出初始塊呢。因為編譯器會在生成class檔案中將初始塊裡的**加到所呼叫的構造器的器中,並在最前面。所以,我們總能看到初始塊裡的**是先於構造器中的**輸出的。到這,這個例子也就理解差不多了。那我們再來看個東西

class d

public int getnum()

}

呼叫getnum(),將會得到什麼呢。沒錯就是4。其實假如再加一段**,我們就可以把它和上面所說的聯絡起來了。

class d

public d()

public int getnum()

}

你覺得這個會輸出什麼呢。的確,是4.那麼當我們這樣寫呢。

class d

private int num = 3;

public d()

public int getnum()

}

num的值就變成了3。所以我們可以得出結論。其實在類中初始化的變數的優先順序和初始塊了初始化變數的優先順序是一樣的。因此,不難理解初始塊裡的**為什麼先於構造器中的輸出了。好了,還不夠,還有點有意思的東西。

class e

public void echo()

}class f extends e

}public class forblogtest

}

請問,這會輸出什麼。

答案是:----->這是子類中的echo

是不是感覺挺好玩的。在編譯過程中什麼事都是按照平常的進行。當時在執行時,子類的方法直接將父類的覆蓋了,所以就輸出了子類echo中的內容。這個原理就有點類似於

class e

}class f extends e

public void test()

}public class forblogtest

}

這個echo是輸出子類中echo裡的**,但是,我們呼叫f.test();時,連編譯器都不能通過。但是強制型別轉化後又能呼叫,說明在執行時,記憶體中載入的的確是f中的方法和變數。

mtk平台關於lcm初始化code的一點總結

最近公司有個專案需要更換lcm,差別如下 原屏mipi 4lane 1280 720 新屏mipi 2lane 800 480 區別很少,按理說最多2天就能亮,結果沒有按理,折騰了8,9天,最後經fae指點發現平台mipi傳送code的方式有坑,又漲姿勢了,總結一下。mipi傳送初始化code有兩種...

java物件初始化過程

假設有一下類 class test test int n 0 我們知道,任何物件在使用前都會被初始化,方法裡面的區域性變數必須給初始化值才能通過編譯。現在我們來討論一下初始化的過程 對於字段 變數 而言,如果是基本型別,那麼即使不給初始值,都會得到jvm預設的初始值 boolean預設是false,...

java物件的初始化順序

物件初始化流程 我們根據一段 來分析物件初始化流程 基類包含一靜態變數 包含一例項變數 包含乙個靜態初始化塊以及乙個構造子 class base public base 一級子類和基類包含的內容一樣 class superclass extends base static public static...