java - 未實(shí)例化的靜態(tài)對(duì)象也能調(diào)用類中的非靜態(tài)方法嗎?
問題描述
有一個(gè)很常見的代碼:System.out.println,這是再常見不過的輸出語句,但是學(xué)了一段時(shí)間突然想起去看了下源碼,下面是源碼:
public final static PrintStream out = null;
out是在System類下定義的,還沒實(shí)例化,out僅僅是一個(gè)null的變量,甚至都不能稱之為靜態(tài)對(duì)象,但是卻能調(diào)用PrintStream類下的println()方法,這就不太理解了?請(qǐng)問為什么?
問題解答
回答1:詳細(xì)解釋:中文版http://www.cnblogs.com/skywan...英文版基于jdk7 https://luckytoilet.wordpress...
回答2:親,首先,當(dāng)你啟動(dòng)你的測(cè)試類,也就是實(shí)例化你的測(cè)試類時(shí),你所調(diào)用的所有靜態(tài)類都會(huì)先實(shí)例化了,所以其實(shí)當(dāng)你執(zhí)行到System.out.println語句時(shí),System這個(gè)類里面的方法和屬性都是已經(jīng)被初始化好了的!
回答3:static {
registerNatives();
}上面這個(gè)靜態(tài)方法的注解說會(huì)調(diào)用initializeSystemClass方法進(jìn)行初始化,這個(gè)方法里面的 setOut0(newPrintStream(fdOut, props.getProperty('sun.stdout.encoding')));應(yīng)該對(duì)out進(jìn)行賦值, private static native void setOut0(PrintStream out)是本地方法;
回答4:一看到final static,第一反應(yīng)就應(yīng)該是這丫的是常量,常量必須是要初始化的,然后再找找,果然他是調(diào)用本地方法去初始化的;
額, 在initializeSystemClass()這個(gè)函數(shù)里面做的初始化工作, 這個(gè)函數(shù)是在系統(tǒng)線程初始化后調(diào)用的, 也就是說, 所有的靜態(tài)成員變量(err out in)都是在這函數(shù)里面初始化了的, 例如說這個(gè)out : FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); setOut0(newPrintStream(fdOut, props.getProperty('sun.stdout.encoding')));而setOut0()函數(shù)是在native層,在native層把初始化的對(duì)象和這個(gè)out建立起連接
相關(guān)文章:
1. objective-c - ios百度地圖定位問題2. javascript - 求助這種功能有什么好點(diǎn)的插件?3. 微信開放平臺(tái) - Android調(diào)用微信分享不顯示4. javascript - 關(guān)于這組數(shù)據(jù)如何實(shí)現(xiàn) 按字母列表分類展示 不改動(dòng)數(shù)據(jù)結(jié)構(gòu)5. javascript - 寫移動(dòng)端的頁面的時(shí)候,有不一快空白,是怎么回事?6. html5 - rudy編譯sass的時(shí)候有中文報(bào)錯(cuò)7. javascript - 關(guān)于定時(shí)器 與 防止連續(xù)點(diǎn)擊 問題8. javascript - ie11以下單擊打開不了file,雙擊可以。求解?9. javascript - 在IE中(9+)平時(shí)的樣式不生效,只有用開發(fā)者工具選中這個(gè)元素才生效,是什么原因?10. Python做掃描,發(fā)包速度實(shí)在是太慢了,有優(yōu)化的方案嗎?
