1. 程式人生 > >Java技術_基礎技術(0003)_類執行順序詳解+例項(阿里面試題)+詳細講解+流程圖

Java技術_基礎技術(0003)_類執行順序詳解+例項(阿里面試題)+詳細講解+流程圖

基礎技術:

對於java類各個成員的執行順序,現拿出阿里的面試題作為樣例(例子非常好,是用心出的題),在這裡重新說明一下java類執行順序的原則。

原始碼下載(包含題、結果、分析過程)

一、總體原則

列出執行順序的原則(這裡本人出了簡化,比較明瞭。可能有漏的,請幫忙補充,但應付該例項足以):

 ==父類先於子類;

 ==靜態先於非靜態;
 ==變數和塊先於構造方法;
 ==變數宣告先於執行(變數賦值、塊執行);(這一點是根據資料在記憶體中是如何儲存的得出的,基本型別、物件、String均不一樣,但是總結起來應該是這樣)
 ==變數賦值與塊優先順序相同;
 ==同優先順序的從上至下執行;

二、例項

直接上題(小馬哥的阿里,問:system.out列印結果。這裡我加上了行號,方便解說):

public class StaticTest {

	public static int k = 0;// 1
	public static StaticTest s1 = new StaticTest("s1");// 2
	public static StaticTest s2 = new StaticTest("s2");// 3
	public static int i = print("i");// 4
	public static int n = 99;// 5
	public int j = print("j");// 6

	{
		print("構造塊");
	}// 7

	static {
		print("靜態塊");
	}// 8

	public static int print(String s) {
		System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n + "\tprint");
		++n;
		return ++i;
	}

	public StaticTest(String s) {
		System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n
				+ "\tStaticTest");
		++i;
		++n;
	}// 9

	public static void main(String[] args) {
		new StaticTest("init");
	}
}

三、執行結果

這裡不廢話,直接上結果(大家都可以去試一下,這裡我加上了sysoN====,一會分析時候用來對看),這一部分內容在下載的程式碼裡也有。結果如下:

/**
	 * 
	 * 輸出結果:
	 * 
	 * syso1 ===="1:j		i=0		n=0		print"
	 * 
	 * syso2 ===="2:構造塊		i=1		n=1		print"
	 * 
	 * syso3 ===="3:s1		i=2		n=2		StaticTest"
	 * 
	 * syso4 ===="4:j		i=3		n=3		print"
	 * 
	 * syso5 ===="5:構造塊		i=4		n=4		print"
	 * 
	 * syso6 ===="6:s2		i=5		n=5		StaticTest"
	 * 
	 * syso7 ===="7:i		i=6		n=6		print"
	 * 
	 * syso8 ===="8:靜態塊		i=7		n=99	<span style="white-space:pre">	</span>print"
	 * 
	 * syso9 ===="9:j		i=8		n=100	<span style="white-space:pre">	</span>print"
	 * 
	 * syso10===="10:構造塊	<span style="white-space:pre">	</span>i=9		n=101	<span style="white-space:pre">	</span>print"
	 * 
	 * syso11===="11:init	<span style="white-space:pre">	</span>i=10	<span style="white-space:pre">	</span>n=102	<span style="white-space:pre">	</span>StaticTest"
	 */

四、分析

一步一步按照上面的原則來分析,應該比較詳細了,這一部分內容在下載的程式碼裡也有。分析如下:

/**
* ====step1====首先宣告StaticTest類的static變數並給與預設值。
*
* 故,執行1、2、3、4、5變數的宣告。執行後變數如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j未宣告;
*
* ====step1 end====
*/
/**
* ====step2====變數宣告完成後,為這些static變數賦值以及執行static塊(賦值和塊優先順序一致,在前面的先執行).
*
* 故,執行1、2、3、4、5的賦值程式碼,8的塊程式碼
*
* ========step2_1====當step2執行到2時,new了一個新的StaticTest物件.
* (此時2、3、4、5的賦值、8的程式碼都沒執行,變數k被賦值為0,其餘仍與step1中一致 )
* 這時,static變數已經宣告(static變數是類屬性,與物件無關),所以這裡直接宣告非static變數並給與預設值。
*
* 故,執行6變數的宣告,執行後變數如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j=0(s1的);
*
* ========step2_2====變數宣告完成後,為這些非static變數賦值以及執行非static塊。
*
* 故,執行6變數的賦值程式碼(syso1====k、n、i、j均+1),7的塊程式碼(syso2====k、n、i均+1),執行後變數如下:
*
* k=2; s1=null; s2=null; i=2; n=2; j=1(s1的);
*
* ========step2_3====變數賦值、塊執行完畢後,執行構造方法。
*
* 故,執行9構造方法(syso3====k、n、i均+1),執行後變數如下:
*
* k=3; s1=StaticTest物件; s2=null; i=3; n=3; j=1(s1的);
*
* ========step2_4====s1構造完畢後,繼續執行3。同樣是new一個新的StaticTest物件.
* 過程與step2_1至step2_3一致。
*
* 故,執行3(syso4====k、n、i、j(j=0)均+1;syso5====k、n、i均+1;syso6====k、n、i均+1),
* 執行後變數如下:
*
* k=6; s1=StaticTest物件; s2=StaticTest物件; i=6; n=6; j=1(s2的);
*
* ========step2_5====s2構造完畢後,繼續執行4、5的賦值,為i和n賦值.
*
* 故,執行4(syso7====k、n、i均+1,i被重新賦值)、5(n被重新賦值)的賦值程式碼,執行後變數如下:
*
* k=7; s1=StaticTest物件; s2=StaticTest物件; i=7; n=99; j未宣告;
*
* ========step2_6====static變數賦值完畢後,執行8的static塊。
*
* 故,執行8(syso8====k、n、i均+1),執行後變數如下:
*
* k=8; s1=StaticTest物件; s2=StaticTest物件; i=8; n=100; j未宣告;
*
* ====step2 end====
*/
/**
* ====step3====static變數及塊完成後,宣告非static變數並給與預設值.
*
* 故,執行6變數的宣告。執行後變數如下:
*
* k=8; s1=StaticTest物件; s2=StaticTest物件; i=8; n=100; j=0(main的);
*
* ====step3 end====
*/
/**
* ====step4====非static變數宣告完成後,為這些變數賦值以及執行非static塊(賦值和塊優先順序一致,在前面的先執行)。
*
* 故,執行6的賦值程式碼(syso9====k、n、i均+1,j=++i),7的塊程式碼(syso10====k、n、i均+1)。執行後變數如下 :
*
* k=10; s1=StaticTest物件; s2=StaticTest物件; i=10; n=102; j=9(main的);
*
* ====step4 end====
*/
/**
* ====step5====變數賦值、塊執行完畢後,執行構造方法。
*
* 故,執行9構造方法(syso11====k、n、i均+1),執行後變數如下:
*
* k=11; s1=StaticTest物件; s2=StaticTest物件; i=11; n=103; j=9(main的);
*
* ====step5 end====
*/

五、執行流程圖

以例項為準,繪製的圖(原創圖,請勿轉載)。

相關推薦

Java技術_基礎技術(0003)_執行順序+例項(阿里試題)+詳細講解+流程圖

基礎技術: 對於java類各個成員的執行順序,現拿出阿里的面試題作為樣例(例子非常好,是用心出的題),在這裡重新說明一下java類執行順序的原則。 原始碼下載(包含題、結果、分析過程)

java abstract 關鍵字 抽象方法和抽象的使用

java abstract 關鍵字 抽象類 抽象方法 的使用詳解 1.關鍵字 2.抽象類 3.抽象方法 4.abstract不能用來修飾屬性、構造器、private、final、static 1.關鍵字

java執行順序、語句執行順序

本文講解Java中類的執行順序 順序應該是這樣的:父類Static->子類static->父類預設{}->父類建構函式->子類預設{}->子類建構函式 所以上面的例子列印順序應該是這樣的: parent static block 父類Stati

Java異常機制--try catch finally 執行順序

引言 關於try catch finally 執行順序的筆試面試題目非常的多,我曾經在牛客網刷題的時候不止一次的碰到過,而且不止一次的做錯過,這裡面需要涉及的細節如果不弄清楚每次做題就會產生似是而非的感覺。這次查閱了很多相關資料,關於try catch fin

Java-執行緒池 ThreadPool 專題 (美團試題)

去美團面試,問到了什麼是執行緒池,如何使用,為什麼要用,以下做個總結 1、什麼是執行緒池:  java.util.concurrent.Executors提供了一個 java.util.concurrent.Executor介面的實現用於建立執行緒池 多執行緒技術主要解決處理器單元內多個執行緒執行的問

java中finally與return的執行順序

一些準備知識:     首先為了說明白java中finally與return的執行順序是怎樣的這個問題,我們需要做一點準備工作。     java方法是在棧幀中執行,棧幀是執行緒私有棧的單位,執行方法的執行緒會為每一個方法分配一小塊棧空間來作為該方法執行時的記憶體空間,棧幀

Java技術_基礎技術(0002)_中介軟體啟動class載入順序(以tomcat為例)

基礎技術: Tomcat的class載入的優先順序一覽 1.$JAVA_HOME/jre/lib/ext/下的jar檔案。 2.環境變數CLASSPATH中的jar和class檔案。

Java技術_基礎技術(0004)_eclipse遠端除錯tomcat

基礎技術: 遠端除錯tomcat步驟:  1==遠端登入至伺服器,開啟tomcat的bin/catalina檔案;  2==在JAVA_OPTS變數後增加:-Xdebug -Xrunjdwp

系統學習(javascript)_基礎(數據型之間的轉換)

eof false () 指定 als 相對 高級 基數 參考 在js中數據類型轉換一般分為兩種,即強制類型轉換和隱式類型轉換(利用javascript弱變量類型轉換)。 強制轉換:   利用js提供的函數parseInt(),parseFloat(),Num

Java的反射基礎技術

 今天本人給大家講解一下Java的反射基礎技術,如有不對的或者講的不好的可以多多提出,我會進行相應的更改,先提前感謝提出意見的各位了!!!   什麼是反射?    反射它是根據位元組碼檔案可以反射出類的資訊、欄位、方法、構造方法等內容,還可以建立物件呼叫方法,我們稱它為

java執行順序問題

面試題 ext per 類的構造函數 on() system 靜態代碼塊 父類 rgs 經常遇到的面試題,一個類繼承另一個類然後問輸出的結果是什麽。個人覺得就是考類的輸出問題(親測) 第一:單一的類執行順序 package Test; public class person

java基礎回顧(五)線程以及synchronized關鍵字

dom com stack 相互 ++ 關於 而是 。。 str 本文將從線程的使用方式、源碼、synchronized關鍵字的使用方式和陷阱以及一些例子展開java線程和synchronized關鍵字的內容。 一、線程的概念 線程就是程序中單獨順序的流控制。線程本 身不能

Chrome調試折騰記_(1)調試控制中心快捷鍵!!!

相同 展示 移動 匹配 tails detail 快速 常用 不同 轉載:http://blog.csdn.net/crper/article/details/48098625 大多瀏覽器的調試功能的啟用快捷鍵都一致…按下F12;還是熟悉的味道; 或者直接 Ctrl

java型轉換(自動轉換和強制轉換)

代碼 oid 高精 log 相加 println 類型轉換詳解 範圍 void 自動轉換 class Hello { public static void main(String[] args) { //自動轉換 int a = 5; byte b = 6

java集合之ArrayList

int() 相等 toa isempty ont ati urn 影響 輸入 一、ArrayList源碼分析 1、全局變量 (1)默認容量(主要是通過無參構造函數創建ArrayList時第一次add執行擴容操作時指定的elementData的數組容量為10) privat

java集合之LinkedList

list詳解 兩種 由於 list接口 add 不為 sel 結點 ESS 一、LinkedList簡介 由於LinkedList是一個實現了Deque的雙端隊列,所以LinkedList既可以當做Queue,又可以當做Stack,在將LinkedList當做Stack時,

Java 基礎:繼承中的執行順序

類的方法 主程 rgs 這一 over print 類繼承 方法 www. 1.單獨的父類測試 Java中,new一個類的對象,類裏面的靜態代碼塊、非靜態代碼、無參構造方法、有參構造方法、類的一般方法等部分, 它們的執行順序相對來說比較簡單,用程序也很容易驗證。 比如

JAVA的Random的用法

Random類 (java.util)         Random類中實現的隨機演算法是偽隨機,也就是有規則的隨機。在進行隨機時,隨機演算法的起源數字稱為種子數(seed),在種子數的基礎上進行一定的變換,從而產生

JAVA載入器

Java類載入器的作用就是在執行時載入類。Java類載入器基於三個機制:委託、可見性和單一性。委託機制是指將載入一個類的請求交給父類載入器,如果這個父類載入器不能夠找到或者載入這個類,那麼再載入它。可見性的原理是子類的載入器可以看見所有的父類載入器載入的類,而父類載入器看不到子類載入器載入的

java基礎 String,equal,final等

對於這個系列裡的問題,每個學Java的人都應該搞懂。當然,如果只是學Java玩玩就無所謂了。如果你認為自己已經超越初學者了,卻不很懂這些問題,請將你自己重歸初學者行列。內容均來自於CSDN的經典老貼。 問題一:我聲明瞭什麼! String s = "Hello world!"; 許多人都