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 ...