首页 > 数据库 > 数据库开发技术 > 在main方法之前,到底执行了什么?
本人在做接口测试的时候,需要用一个公共类来把所有的执行的代码,然后这个公共类有hsot和hosttype等属性来区分各个测试环境,然后在去不同的地方取用例和请求接口。在给这些属性复制的时候,我是通过不同测试环境新建不同的配置文件,然后执行每个环境的时候让只加载需要测试的环境的配置文件来实现管理测试环境的。中间遇到了一些坑,主要就是对java代码执行循序,特别是在main方法之前的代码执行顺序了解不深入导致的,中间有多个继承关系也有点扰乱了思路。下面分享一下自己这个错误的复现步骤。
首先放一下一个单独的类的代码执行顺序,下面是代码:
1package practice;
2
3public class Cbc {
4 public static Cbc cbc = new Cbc();
5
6 public static void main(String[] args) {
7 System.out.println("进入程序入口了!");
8 }
9
10 public Cbc() {
11 System.out.println("我是Cbc构造方法!");
12 }
13
14 static {
15 System.out.println("我是Cbc静态代码块!");
16 }
17}
下面是执行结果:
我是Cbc构造方法!
我是Cbc静态代码块!
进入程序入口了!
这个就比较简单了,先执行静态变量赋值,然后执行静态代码块,然后再去执行main方法。
下面是多个继承的情况,Cba继承于Bbc,Bbc继承于Abc,三个类的代码都是相似的,分享如下:
1package practice;
2
3public class Cbc extends Bbc{
4 public static Cbc cbc = new Cbc();
5
6 public static void main(String[] args) {
7 System.out.println("进入程序入口了!");
8 }
9
10 public Cbc() {
11 System.out.println("我是Cbc构造方法!");
12 }
13
14 static {
15 System.out.println("我是Cbc静态代码块!");
16 }
17}
18
19class Bbc extends Abc {
20 public static Bbc bbc = new Bbc();
21
22 public Bbc() {
23 System.out.println("我是Bbc构造方法!");
24 }
25
26 static {
27 System.out.println("我是Bbc静态代码块!");
28 }
29}
30
31class Abc {
32 public static Abc abc = new Abc();
33
34 public Abc() {
35 System.out.println("我是Abc构造方法!");
36 }
37
38 static {
39 System.out.println("我是Abc静态代码块!");
40 }
41}
下面是执行结果:
我是Abc构造方法!
我是Abc静态代码块!
我是Abc构造方法!
我是Bbc构造方法!
我是Bbc静态代码块!
我是Abc构造方法!
我是Bbc构造方法!
我是Cbc构造方法!
我是Cbc静态代码块!
进入程序入口了!
可以看出来,先执行Abc,再去执行Bbc,再去执行Cbc。
知道了这个逻辑,就可以做一些事情,比如Abc有一个int对象num的值是1,是公用默认的,但是我想在某一个特殊(Cbc)情况下使用num值是2,那么我可以Bbc里面对num重新赋值,使得我在使用Cbc这个情况下时候,num值是2,而在其他情况时,num的值依然是1。
下面是测试代码:
1public class Cbc extends Bbc {
2 public static void main(String[] args) {
3 System.out.println("进入程序入口了!");
4 System.out.println("num的值:" + num);
5 }
6}
7
8class Bbc extends Abc {
9 static {
10 num = 2;
11 }
12}
13
14class Abc {
15 public static int num = 1;
16
17}
下面是执行结果:
进入程序入口了!
num的值:2
原文作者:FunTester;如有侵权,请联系管理员删除。