好程式設計師Java培訓之類的例項化步驟
好程式設計師 Java 培訓之類的例項化步驟,希望對同學們學習 java 開發有所幫助,首先對於 java 工程師來說, static 非常容易在面試的時候被問到。書面上說 static 是靜態的。其實我把它理解為“全域性的”。什麼叫全域性的?全域性的屬性,全域性的方法,全域性的程式碼塊。
全域性屬性,全域性方法,比較好理解就是這個類所有的物件都共有的屬性和方法。因為是整個類共有的,所以可以透過宣告直接呼叫。我把它理解為“單例模式”的屬性和方法。所謂單例模式就是指這個類宣告的所有物件共享這些屬性和方法。一個物件對這個屬性進行了修改,所有物件再調這個屬性都是修改後的值了。
下面主要說一下static 修飾的程式碼塊,面試的一大考點就是 static 程式碼塊是什麼時候被載入的。
首先我們需要了解一下java 虛擬機器對類的載入過程。首先 JVM 會透過 classloader 將類的位元組碼轉換成相應的 Class 物件。其中 classloader 是雙親委託的方法來查詢類檔案的。
就是首先委託父類的classloader 查詢(父類也有父類就交由父類的父類查詢以此類推,直到不再繼承別的 classloader 的類),如果查詢不到再由自己來查詢。如果自己也找不到就丟擲異常。以上是準備工作,當這個類抽次被使用,我們會顯出石化這個類(如果有父類就先初始化他的父類),在初始化的過程中我們會處理 static 修飾的程式碼。就是我們這裡要說的 static 程式碼塊。每個類知會初始化 1 次。(我們可以透過改變方法 Class.forName() 中的第二個引數來控制是否初始化一個類)。
以下為網上找的一個經典的例子。
面試題目如下:請寫出程式執行完成之後的結果。
package extend;
public class X {
Y y=new Y();
static{
System.out.println("tttt");
}
X(){
System.out.println("X");
}
public static void main(String[] args) {
new Z();
}
}
class Y{
Y(){
System.out.println("Y");
}
}
class Z extends X{
Y y=new Y();
static{
System.out.println("tt");
}
Z(){
System.out.println("Z");
}
}
先不告訴最後結果,我們先來分析下。一步一步推出結果。
1. 首先分析一段程式的執行後的結果,我們得先找到程式的入口,然後才能著手分析。也就是 main() 方法。
2. 我們發現 main() 方法在 X 類中,要執行 main ()方法,還得先將 X 類載入到記憶體中。
3.X 類載入完成後,會做什麼事情呢?別急,先來看看 static 的作用,不知道吧。告訴你: static 就是在類被第一次載入的時候執行,以後就不再執行。
4. 知道了 static 的作用,那麼 X 類被載入,那麼就會先執行 X 類的靜態屬性和靜態語句塊( static ),執行先後順序看誰在前面就先執行誰。只在此時執行,以後都不會。
5. 所以一個輸出結果為 tttt, 沒問題了吧。
6.X 類的 static 語句塊執行完了,就該執行 main() 方法啦。
7.newZ(); 此方法被執行。
8. 既然 newZ(); 那麼 Z 類就要被載入。因為 Z 類繼承 X 類。所以必須先載入 X 類才行。因為 X 類已經被載入。所以此時不用再載入 X 類了。 Z 類載入好了就要執行 Z 類的 static 語句塊
9. 那麼就會列印出 tt 了吧。
10. 都加在完後就要例項化物件了。
11. 例項化 Z 之前,還得先例項化 X 對吧。因為子類的構造方法都會呼叫父類的構造方法。
12. 那就先例項化 X 類吧。
13. 執行 X 方法前還得先初始化對不。也就是獲取所有屬性。那麼 X 類的屬性 Y 就會獲取。
14. 即 X 類的 Yy=newY(); 要被執行。也就是會列印 Y 。
15. 接著執行 System.out.println("X");
16. 然後就是執行 Z 的構造方法
17. 同樣先獲取 Z 的屬性 Yy=newY(); 列印 Y 。
18. 再執行 System.out.println("Z");
整個過程就是這樣了。現在知道結果了吧:
tttt
tt
Y
X
Y
Z
記住,面試有可能會標出一些語句的,讓你選擇這些語句的執行順序。不過只要知道原理,就沒什麼難的了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2728883/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享JDBC運算元據庫的步驟程式設計師JavaJDBC
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java培訓Java容器類List和Set分析程式設計師Java
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java
- 好程式設計師Java培訓Java程式設計師必學技術程式設計師Java
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓分享Java面試題之Java集合篇三程式設計師Java面試題
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- Java程式設計師培訓班哪家比較好Java程式設計師
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java培訓分享Java之命名、標示符、變數程式設計師Java變數
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享-簡單的效能最佳化技巧程式設計師Java
- 好程式設計師Java培訓分享之RMI與RPC的區別程式設計師JavaRPC
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 好程式設計師Java培訓分享Java初學者必讀程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 黑馬程式設計師Java培訓和Android培訓:內部類程式設計師JavaAndroid
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享Mybatis面試題集合程式設計師JavaMyBatis面試題
- 好程式設計師Java培訓Java最常用的五個註解程式設計師Java
- 好程式設計師Java培訓分享Java集合的兩種排序方法程式設計師Java排序
- 好程式設計師Java培訓簡述Java新手如何學程式碼程式設計師Java
- 好程式設計師Java培訓分享Java面試題集合篇一程式設計師Java面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師Java培訓分享面試Java要注意什麼程式設計師Java面試
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件