會了這道題,基礎隨便考。寫出輸出結果
class b
static int bj()
public b()
void nihao()
}public class c extends b
static int cj()
public c()
public c(int i,int j)
//重寫了父類方法
public void nihao()
public static void main(string args)
}
寫出後請對下面答案:
對了,那麼你是大神,請 return; else:
我們來分析下:
首先我們要知道,執行程式分兩階段,
1.類載入階段,此時static修飾的變數在此階段會初始化(賦值),只有類的靜態成員首次被呼叫的時候才會進行類載入(構造方法實際上也是靜態方法)順序:先父類再本類。這個階段只有一次。
(說明下:靜態變數在類載入階段已經初始化了,靜態的只有乙份,類載入也只有一次,所以類載入的時候載入靜態變數,good! sun-man!)
2.類初始化階段,。呼叫構造的時候執行,new多少個物件就存在多少次類初始化。
(說明下:每次new物件,都會進行類初始化,你new了多少物件,就有多少份非static的變數存在。)
從結果說起
「main--------」 之前就是類載入,我們知道我們的程式從main()開始執行,main()是靜態的,剛才說了「只有類的靜態成員首次被呼叫的時候才會進行類載入」,所以執行靜態main()之前,先載入其所在類class c,
①首先類載入b ,「static修飾的變數在此階段會初始化」,static int j=bj(); bj()輸出
b 初始化 j=1
②類載入c, c的變數 static int j=bj(); bj()輸出
c 初始化 j=2
此時類載入完畢 開始
main----------
執行super(),即呼叫父類無引數構造,
③b初始化 非static修飾的變數初始化: int i = bi(); bi()執行 輸出
b 初始化 i=1
,執行構造方法
b 無參構造
呼叫子類重寫的nihao(); 子類此時還沒有初始化,即非靜態的i還沒有賦值,所以只能輸出初始值0;j=2就不說了(static在類載入時候就已經初始化了,前面說了)
c 你好 i=0,j=2
④super()完畢(父類初始化後),本類初始化 int i = ci();
c 初始化 i=2
⑤圖中的3此時就輸出了初始化後的值
c 你好 i=2,j=2
⑥this.i=i;this.j=j;後你好()輸出,不用說了:
c 你好 i=3,j=3
有深度,面試有用的題
1.jdk1.5新增的功能 2.字元流和位元組流的區別,使用場景,相關類 3.執行緒安全的概念,實現執行緒安全的幾種方法 4.抽象類和介面的區別,使用場景 5.hash演算法的實現原理,hashcode的實現原理 error和exception的區別,runtimeexception和非runtim...
Java面試真題
1.簡述抽象類和抽象方法的作用 分析 抽象類主要用來提供多個派生類可共享的基類的公共定義,他與非抽象類的主要區別如下 1 抽象類只能作為其他類的基類,不能直接例項化,對抽象類不能使用new操作符 2 抽象類中可以包含抽象成員,但非抽相類不可以 3 如果乙個非抽象類從抽象類中派生,則其必須通過覆蓋來實...
Spring面試基礎題
1.你有沒有用過spring的aop?是來幹嘛的?大概會怎麼使用?答 1 有 2 用來實現橫切關注點與他們所影響的物件之間的解耦 橫切關注點 橫切關注點是散布於應用中多處的功能。橫切關注點是與應用的業務邏輯相分離的,往往會直接嵌入到應用的業務邏輯之中 2.如果1個介面有2個不同的實現,那麼怎麼來au...