前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在main方法之前,到底执行了什么?

在main方法之前,到底执行了什么?

作者头像
FunTester
发布2019-08-30 16:10:05
6960
发布2019-08-30 16:10:05
举报
文章被收录于专栏:FunTesterFunTester

本人在做接口测试的时候,需要用一个公共类来把所有的执行的代码,然后这个公共类有hsot和hosttype等属性来区分各个测试环境,然后在去不同的地方取用例和请求接口。在给这些属性复制的时候,我是通过不同测试环境新建不同的配置文件,然后执行每个环境的时候让只加载需要测试的环境的配置文件来实现管理测试环境的。中间遇到了一些坑,主要就是对java代码执行循序,特别是在main方法之前的代码执行顺序了解不深入导致的,中间有多个继承关系也有点扰乱了思路。下面分享一下自己这个错误的复现步骤。

首先放一下一个单独的类的代码执行顺序,下面是代码:

代码语言:javascript
复制
package practice;

public class Cbc {
    public static Cbc cbc = new Cbc();

    public static void main(String[] args) {
        System.out.println("进入程序入口了!");
    }

    public Cbc() {
        System.out.println("我是Cbc构造方法!");
    }

    static {
        System.out.println("我是Cbc静态代码块!");
    }
}

下面是执行结果:

我是Cbc构造方法! 我是Cbc静态代码块! 进入程序入口了!

这个就比较简单了,先执行静态变量赋值,然后执行静态代码块,然后再去执行main方法。 下面是多个继承的情况,Cba继承于Bbc,Bbc继承于Abc,三个类的代码都是相似的,分享如下:

代码语言:javascript
复制
package practice;

public class Cbc extends Bbc{
    public static Cbc cbc = new Cbc();

    public static void main(String[] args) {
        System.out.println("进入程序入口了!");
    }

    public Cbc() {
        System.out.println("我是Cbc构造方法!");
    }

    static {
        System.out.println("我是Cbc静态代码块!");
    }
}

class Bbc extends Abc {
    public static Bbc bbc = new Bbc();

    public Bbc() {
        System.out.println("我是Bbc构造方法!");
    }

    static {
        System.out.println("我是Bbc静态代码块!");
    }
}

class Abc {
    public static Abc abc = new Abc();

    public Abc() {
        System.out.println("我是Abc构造方法!");
    }

    static {
        System.out.println("我是Abc静态代码块!");
    }
}

下面是执行结果:

我是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。

下面是测试代码:

代码语言:javascript
复制
public class Cbc extends Bbc {
    public static void main(String[] args) {
        System.out.println("进入程序入口了!");
        System.out.println("num的值:" + num);
    }
}

class Bbc extends Abc {
    static {
        num = 2;
    }
}

class Abc {
    public static int num = 1;

}

下面是执行结果:

进入程序入口了! num的值:2

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档