1. 程式人生 > >Java類中程式碼執行順序

Java類中程式碼執行順序

先上程式碼:
1.程式碼片段一:

/**
* @author szn25
*/
public class Main {
static {
System.out.println("main.static!");
}

public static int function(){
int ret = 0;
try{
System.out.println("try");
C c = new C();
// throw new Exception();
return ret;
} catch (Exception e){
System.out.println("catch");
ret = -1;
return
ret; } finally { System.out.println("finally"); ret = 1; return ret; } } public static void main(String[] args) { System.out.println("Hello World Begin!"); int t = function(); System.out.println(t); System.out.println("Hello World End!"); } } class A { static { System.out.println("A.static!"); } A(){ System.out
.println("A()!"); } A(String a){ System.out.println("A(a)!"); } } class B extends A{ static { System.out.println("B.static!"); } A a = new A("a"); B(){ System.out.println("B()!"); } B(String b){ System.out.println("B(b)!"); } } class C { static { System.out.println("C.static!"); } B b = new B("x"); C(){ System.out
.println("C()!"); } }

2.程式碼片段二:

/**
* @author szn25
*/
public class Main {
static {
System.out.println("main.static!");
}

public static int function(C c){
int ret = 2;
try{
System.out.println("try");
// throw new Exception();
ret = 0;
c.setValue(0);
return ret;
} catch (Exception e){
System.out.println("catch");
ret = -1;
c.setValue(-1);
return ret;
} finally {
System.out.println("finally");
ret = 1;
c.setValue(1);
}
}

public static void main(String[] args) {
System.out.println("Hello World Begin!");
C c = new C();
int t = function(c);
System.out.println(t);
System.out.println(c.getValue());
System.out.println("Hello World End!");
}
}

class A {
static {
System.out.println("A.static!");
}
A(){
System.out.println("A()!");
}
A(String a){
System.out.println("A(a)!");
}
}
class B extends A{

static {
System.out.println("B.static!");
}
A a = new A("a");
B(){
System.out.println("B()!");
}
B(String b){
System.out.println("B(b)!");
}
}
class C {
private int value;
static {
System.out.println("C.static!");
}
B b = new B("x");

C(){
System.out.println("C()!");
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}
}

再上執行結果:
1.程式碼片段一:
這裡寫圖片描述
2.程式碼片段二:
這裡寫圖片描述
分析:
1. try/catch/finally:
try中的程式碼順序執行(單執行緒的情況下),遇到異常時會被catch捕獲,try塊中從發生異常的那行程式碼起,後面的程式碼都不會被執行;catch從異常程式碼行起接管,執行catch程式碼塊。finally程式碼塊在整個方法返回之前執行,注意:finally中如果沒有return語句,程式碼塊對返回基本型別變數的修改並不會生效,但是對引用物件來說還是會被影響;如果有,那麼會以finally程式碼段返回為準
2.static/構造方法/父類構造方法:
用static修飾的屬性或者方法,在類被載入時就會執行,如果一個子類被載入,會先去載入其父類,static程式碼按順序執行。構造方法在建立類的例項時才會執行,類中若無顯示的申明無參的構造方法,會預設生成一個,子類的構造方法中,若顯示的呼叫父類的構造方法必須在最前面,若無顯示呼叫,則預設先呼叫父類的無參構造方法。

相關推薦

Java程式碼執行順序

先上程式碼: 1.程式碼片段一: /** * @author szn25 */ public class Main { static { System.out.println("main.static!"); } public static int fun

程式碼執行順序 及 組合

一  類的名稱空間:   類中的程式碼在什麼時候執行的?  在例項化之前,也就是說在建立一個類時,類自己先給自己建立 建一塊空間,也就是公共的空間.(裡面會把靜態變數和__init__及方法方進去) 類中程式碼執行順序:(在例項化之前就執行了) 問題:一個類中可不可以沒有__i

java 繼承程式碼執行順序(個人見解)

面試題 以下程式碼執行結果 public class Test { class Super{ int flag=1; Super(){ test(); } void test(){

java程式碼執行順序(靜態程式碼塊、建構函式)

1、方法、塊對應靜態和普通兩個級別,如果不產生例項,就只執行靜態部分,所有關聯類中的靜態部分總先於非靜態(例項化)部分執行。 2、靜態部分:靜態變數初始化--靜態程式碼塊--main方法。 3、非靜態部分(物件例項化過程):成員變數初始化--非靜態程式碼塊---建構函式 4、父類先於子類。靜態部分:父類靜態

一.js高階(6)-閉包-定時器-js程式碼執行順序

閉包1:巢狀的兩個作用域中 內層作用域訪問外層作用域 區域性變數的 過程 閉包2 :  就是能夠訪問其他函式內部變數的函式;     由於js中只有函式內部的子函式才能訪問區域性變數,所以可以簡單的把閉包理解為"定義在哈拿書內部的函式";     本質上閉包就是連線函式內部和外部的一座橋樑;

java 初始化 執行順序

package inheritance; public class InitializeClassObject { public static void main(String[] args) { System.out.println("初始化第一個C類物件");

測試框架Unitest的執行原理,以及多個測試執行順序以及簡化方法

單元測試單元測試(unit testing)是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函式,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的

java程式碼執行順序

package io; public class Employee { private static int nextId = 1; //靜態變數可以使用 類名.變數名 來呼叫 private String name; public Employee (String

Java的靜態屬性、靜態程式碼塊塊、非靜態屬性、非靜態程式碼塊塊、建構函式在初始化時的執行順序

序言   前幾天在複習J2SE的時候,看到了這個Java類在new的過程中,靜態域、靜態塊、非靜態域、非靜態塊、建構函式的執行順序問題。就想著自己總結寫一下,便於以後查閱總結:    以下是我整理好的結果;在java類new一個物件的過程中,它們的執行順序如下:     (當

java屬性優先執行順序

類屬性 bsp line 優先 edit p s 加載 塊代碼 父類構造函數 1.父類靜態代碼塊 ( java虛擬機加載類時,就會執行該塊代碼,故只執行一次) 2 .子類靜態代碼塊 ( java虛擬機加載類時,就會執行該塊代碼,故

java各屬性成員執行順序

     我們都知道類(class)由成員變數和成員方法(成員函式)構成,其中還有一個由一對大括號{}組成的程式碼塊,下面通過一個簡單的小例子,驗證一個普通的java類中成員的載入順序,類在進行初始化的時候載入順序是這樣的:   靜態程式碼塊|助手方法->一般程式碼塊

Java各部分的執行順序

直接看程式碼,這個例子寫的比較複雜,包含了大多數情況,所以讀起來得耐心點。 public class ClassLoadTest { ClassLoadTest(){ System.out.println("構造一個ClassLoad

java 各部分的執行順序

package com.fjf.test.classloadoreder; /** * * *參考:https://blog.csdn.net/anticlql/article/det

java的初始化順序

log 初始化 靜態變量 clas bsp 類成員變量 art 類成員 學習 1)父類靜態資源加載:靜態變量、靜態方法、靜態初始化塊   按靜態資源的定義順序來加載 2)子類靜態資源加載:同上 3)父類成員變量、成員方法、初始化塊 4)父類構造器 5)子類成員變量、成員方法

Java 基礎:繼承執行順序

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

Java構造方法執行順序

1 public class Test { 2 class Super { 3 int flag = 1; 4 5 Super() { 6 test(); 7 } 8 9 void te

Java檔案程式執行順序

只要按照這個步驟,遇到這一類問題就可以解決了。 1.類中所有屬性的預設值(一舉而成) 2. 父類靜態屬性初始化,靜態塊,靜態方法的宣告(按出現順序執行) 3. 子類靜態屬性初始化,靜態塊,靜態方法的宣告 (按出現順序執行) 4. 呼叫父類的構造方法, 首先父類的非靜態成員

Python的 if __name__ == "__main__" 的作用、程式碼執行順序、特殊變數

寫這個問題是因為之前自己會在.py檔案中寫一個def main():, 然後再執行main(),結果被批了,說Python比較規範的寫法應該是 if __name__ == "__main__" : 然後在此程式碼塊中寫要執行的主函式。這裡將 對if __name__ ==

面對物件——繼承程式碼執行順序問題

1、類中成員變數的初始化過程      預設初始化(賦值為預設值)——>顯式初始化(通過成員變數初始化)——>構造方法初始化(通過構造方法初始化) 2、子類和父類的初始化(分層初始化)      先初始化父類,然後初始化子類 3、程式碼中的程式碼塊執行順序

淺談java成員的初始化順序(一)

類被建立之後的成員的初始化順序到底是怎麼樣的? 首先 不考慮繼承 package com; public class DemoOne { /** * 關於類的初始化順序 */ //不考慮繼承結構的情況 private static int a;