Java类中代码执行顺序

时间:2021-02-27 15:41:45

先上代码:
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.代码片段一:
Java类中代码执行顺序
2.代码片段二:
Java类中代码执行顺序
分析:
1. try/catch/finally:
try中的代码顺序执行(单线程的情况下),遇到异常时会被catch捕获,try块中从发生异常的那行代码起,后面的代码都不会被执行;catch从异常代码行起接管,执行catch代码块。finally代码块在整个方法返回之前执行,注意:finally中如果没有return语句,代码块对返回基本类型变量的修改并不会生效,但是对引用对象来说还是会被影响;如果有,那么会以finally代码段返回为准
2.static/构造方法/父类构造方法:
用static修饰的属性或者方法,在类被加载时就会执行,如果一个子类被加载,会先去加载其父类,static代码按顺序执行。构造方法在创建类的实例时才会执行,类中若无显示的申明无参的构造方法,会默认生成一个,子类的构造方法中,若显示的调用父类的构造方法必须在最前面,若无显示调用,则默认先调用父类的无参构造方法。