一道關於例項化順序的題目

2021-09-30 09:21:54 字數 1494 閱讀 5891

public class basea

public basea()

public virtual void myfun()

}public class baseb : basea

public baseb()

public new void myfun()

}static class program

}public class mytest

}

在看到這樣一道面試題目。

問題是:請寫出main()方法中,a1-a5,b1-b5這十個類例項化的順序。

正確答案:

b1

b3 b2

a1 a3

a2 a4

b4 b5

知識點:

內聯(inline)方式初始化字段。

型別構造器(靜態建構函式)的執行時間。

c#中基類和子類例項化的順序。

new修飾符的作用。

這個知識點在《clr via c#》書中有講到,所謂內聯方式,就是初始化欄位的一種簡化語法。來看示例**:

public class sometype

這種在類中宣告變數時進行賦值的方式就叫做內聯,大致等效於下面的**:

public class sometype

}

之所以說大致等效,因為兩者的執行順序上略有差異,編譯器會首先生成內聯方式的**,然後再呼叫建構函式。

比如,下面的**,最後m_x的結果就為10。

public class sometype

}

所謂型別構造器也就是我們熟知的靜態構造方法,在我們編寫的類中,都會有乙個預設的靜態無參構造方法,跟無參例項構造方法一樣是預設存在的。

每當我們對乙個類建立第乙個例項或訪問靜態欄位前,jit編譯器就會呼叫該類的靜態構造方法。當然,靜態變數也可以使用上面說的內聯方法進行賦值。

這裡可以看出,當第一次例項化某個類時,會首先呼叫該類的靜態構造方法。

這個知識點比較簡單,那就是在呼叫子類例項構造方法之前會呼叫基類的例項構造方法。從面試題的結果可以看出,基類的構造方法又比子類的靜態建構函式晚一些,此處因個人能力有限,我也沒辦法從更底層的角度去分析原理,只能暫且記住吧。

我看過不少關於new以修飾符的形式用在方法宣告中的題目,關於new的用法在msdn上也都查的到,官方說法是顯式隱藏從基類繼承的成員。

我個人的理解比較簡單:當子類中,乙個方法的簽名(指引數,方法名,返回值)與基類的乙個方法相同,通過加入new修飾符,可以讓子類不做更改的去使用該方法。

說到底,new修飾符就是讓兩個不相關的同名方法同時存在而已。(這裡同名指相同的方法簽名)

一道關於載入順序的題目分析

package com.gt.world.oa.aaa author gt public class test20140331 static public test20140331 string str private static int print string str public stati...

一道關於例項化順序的C 面試題

最近找工作,面試了幾家公司,其中有一家公司的面試題給我印象很深,不久前在看過類似的題目,但這次的更複雜,題目如下 public class basea public basea public virtual void myfun public class baseb basea public bas...

360一道關於this的題目

原題目是這樣子的 window.val 1 var obj 說出下面的輸出結果 obj.dbl var func obj.dbl func this呢其實就是這樣,分清楚呼叫就好了。obj中的沒有指定呼叫。預設從函式中查詢。如果沒有則往上一級查詢。所以 上面的式子可以寫成這樣 window.val ...