zl程序教程

您现在的位置是:首页 >  Java

当前栏目

java中的代码块执行顺序

2023-04-18 12:37:41 时间

本文主要讲述java中代码块的细节

vip

2)3)示例代码如下:

public class CodeBlockDetail {
    public static void main(String[] args) {

        // 类别加载的情况举例
        // 1.是对象创建时
//        new AA();
        // 2.创建子类对象,父类先加载
//        new BB();
        // 3.使用类的静态属性/方法
//        System.out.println(Cat.age);

        // 静态代码块在类加载时执行,并且只执行一次
        // 非静态代码块,随着对象的创建,被调用.
//        CC c1 = new CC();
//        CC c2 = new CC();
        // 当调用静态变量/方法时,非静态代码块不会被调用,只会调用静态代码块
//        System.out.println(CC.age);
        CC.getAge();
    }

}

class CC {
    public static int age = 10;
//    private String name = "Tom";

    public static void getAge(){
        System.out.println(age);
    }
    static {
        System.out.println("CC的static代码块2在执行...");
    }
    {
        System.out.println("CC的非静态代码块别执行...");
    }
}

class Animal {

    static {
        System.out.println("Animal的static代码块4在执行...");
    }
}

class Cat extends Animal{

    public static int age = 20;
    static {
        System.out.println("Cat的static代码块3在执行...");
    }
}

class BB extends AA {
    static {
        System.out.println("BB的static代码块2在执行...");
    }
}

class AA {
    // 静态代码块,随着类的加载而执行
    static {
        System.out.println("AA的static代码块1在执行...");
    }
}

 

vip

4)示例代码如下:

public class CodeBlockDetail01 {
    public static void main(String[] args) {
        A a = new A(100);

    }
}

class A {
    /*
    静态代码块和静态方法,先于普通代码块和普通方法执行。
    构造器最后被调用....
     */
    {
        System.out.println("非static代码块...");
    }
    public int id = getId();
    // 非静态代码块


    // 静态代码块
    static {
        System.out.println("static静态代码块...");
    }

    // 静态变量只能由静态方法赋初始值...
    public static int age = getAge();

    public static int getAge(){
        System.out.println("getAge()...");
        return 100;
    }

    public int getId(){
        System.out.println("getId()");
        return 50;
    }

    public A(int id) {
        System.out.println("public A(int id)调用...");
        this.id = id;
    }
}

运行结果:
vip

 

vip

 5)示例代码如下:

public class CodeBlockDetail02 {
    public static void main(String[] args) {
        BBB bbb = new BBB();
    }
}

/** 静态方法/变量/代码块,随着类信息的加载而加载。
 * (1) AAA的static代码块
 * (2) BBB的static代码块
 * (3) AAA的普通代码块....
 * (4) public AAA()构造器....
 * (5) BBB的非静态代码块....
 * (6) public BBB()构造器....
 */
class AAA {
    static {
        System.out.println("AAA的static代码块");
    }
    {
        System.out.println("AAA的普通代码块....");
    }
    public AAA(){
        // (1)super()调用父类的无参构造器
        // (2)本类的普通代码块
        System.out.println("public AAA()构造器....");
    }

}
class BBB extends AAA{
    static {
        System.out.println("BBB的static代码块");
    }
    {
        System.out.println("BBB的非静态代码块....");
    }
    public BBB() {
        // (1) super(),调用父类的无参构造器.
        // (2) 本类的普通代码块
        System.out.println("public BBB()构造器....");
    }
}

运行结果:

vip

 

vip

6)示例代码如下:

public class CodeBlockDetail03 {
    public static void main(String[] args) {
        Cc cc = new Cc();
    }
}

/**
 * (1) Aa的静态代码块
 * (2) Bb的静态代码块
 * (3) Cc的静态代码块
 * (4) Aa的非静态代码块
 * (5) public Aa()构造器
 * (6) Bb的非静态代码块
 * (7) public Bb()构造器
 * (8) Cc的非静态代码块
 * (9) public Cc()构造器
 */
class Aa {
    {
        System.out.println("Aa的非静态代码块");
    }
    static {
        System.out.println("Aa的静态代码块");
    }
    public Aa() {
        // (1) super()父类的构造器
        // (2) 本类的普通代码块
        System.out.println("public Aa()构造器");
    }

}
class Bb extends Aa{
    {
        System.out.println("Bb的非静态代码块");
    }
    static {
        System.out.println("Bb的静态代码块");
    }
    public Bb() {
        // (1) super()父类的构造器
        // (2) 本类的普通代码块
        System.out.println("public Bb()构造器");
    }

}
class Cc extends Bb{
    {
        System.out.println("Cc的非静态代码块");
    }
    static {
        System.out.println("Cc的静态代码块");
    }
    public Cc() {
        // (1) super()父类的构造器
        // (2) 本类的普通代码块
        System.out.println("public Cc()构造器");
    }

}

运行结果:

vip

 

综合示例代码:【困难】

  1 public class CodeBlockDetail03 {
  2     public static void main(String[] args) {
  3         /**
  4          * (1)加载类的信息,静态成员随着类的加载而执行
  5          * 1.1执行父类的静态方法,对静态成员变量赋值和静态代码块,【二者按照定义的顺序执行】
  6          * 1.2执行子类的静态方法,对静态成员变量赋值和静态代码块.
  7          * 1.3执行父类的非静态方法,对非静态变量赋值
  8          * 1.4执行子类的非静态方法,对非静态变量赋值,此时类加载完成.
  9          * (2)调用构造器,创建对象
 10          * 2.1默认第一行是super(),即调用父类的无参构造器
 11          * 2.2默认第二行是本类的普通代码块【非静态代码块】的执行
 12          *  Cc的构造器->Bb的构造器->Aa的构造器,
 13          *  先执行super(),调用父类构造器,接着调用本类的普通代码块
 14          */
 15 
 16         Cc cc = new Cc();
 17     }
 18 }
 19 
 20 /**
 21  * (1) Aa的public static int getVal()
 22  * (2) Aa的静态代码块
 23  * (3) Bb的public static int getVal()
 24  * (4) Bb的静态代码块
 25  * (5) Cc的public static int getVal()
 26  * (6) Cc的静态代码块
 27  * (7) Aa的public int getAid()
 28  * (8) Aa的非静态代码块
 29  * (9) public Aa()构造器
 30  * (10) Bb的public int getBid()
 31  * (11) Bb的非静态代码块
 32  * (12) public Bb()构造器
 33  * (13) Cc的public int getCid()
 34  * (14) Cc的非静态代码块
 35  * (15) public Cc()构造器
 36  */
 37 class Aa {
 38     /*
 39     静态成员只能调用静态成员(属性/方法)
 40     普通变量既能调用静态成员,又能调用非静态成员
 41      */
 42     public static int sa_id = getVal();
 43     public int aid = getAid();
 44     {
 45         System.out.println("Aa的非静态代码块");
 46     }
 47     static {
 48         System.out.println("Aa的静态代码块");
 49     }
 50     public Aa() {
 51         // (1) super()父类的构造器
 52         // (2) 本类的普通代码块
 53         System.out.println("public Aa()构造器");
 54     }
 55 
 56     public static int getVal(){
 57         System.out.println("Aa的public static int getVal()");
 58         return 1;
 59     }
 60 
 61     public int getAid(){
 62         System.out.println("Aa的public int getAid()");
 63         return 1;
 64     }
 65 
 66 }
 67 class Bb extends Aa{
 68     public static int sb_id = getVal();
 69     public int b_id = getBid();
 70 
 71     {
 72         System.out.println("Bb的非静态代码块");
 73     }
 74     static {
 75         System.out.println("Bb的静态代码块");
 76     }
 77     public Bb() {
 78         // (1) super()父类的构造器
 79         // (2) 本类的普通代码块
 80         System.out.println("public Bb()构造器");
 81     }
 82 
 83     public static int getVal(){
 84         System.out.println("Bb的public static int getVal()");
 85         return 10;
 86     }
 87 
 88     public int getBid(){
 89         System.out.println("Bb的public int getBid()");
 90         return 10;
 91     }
 92 
 93 }
 94 class Cc extends Bb{
 95     public static int sc_id = getVal();
 96     public int c_id = getCid();
 97     {
 98         System.out.println("Cc的非静态代码块");
 99     }
100     static {
101         System.out.println("Cc的静态代码块");
102     }
103     public Cc() {
104         // (1) super()父类的构造器
105         // (2) 本类的普通代码块
106         System.out.println("public Cc()构造器");
107     }
108 
109     public static int getVal(){
110         System.out.println("Cc的public static int getVal()");
111         return 100;
112     }
113 
114     public int getCid(){
115         System.out.println("Cc的public int getCid()");
116         return 100;
117     }
118 
119 }

 

运行结果:
vip