专栏首页FunTester在main方法之前,到底执行了什么?

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

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

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

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,三个类的代码都是相似的,分享如下:

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。

下面是测试代码:

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

本文分享自微信公众号 - FunTester(NuclearTester),作者:八音弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自动化测试中java多线程的使用实例

    本人在学习android UiAutomator和selenium2java的时候,经常与遇到一些跟数据库相关的问题,比如我提交了一个订单,我想从数据库中查询这...

    FunTester
  • Groovy中的list

    在上一期从Java到Groovy的八级进化论中,我分享了Java是如何转变成Groovy。今天,我将分享学习Groovy对list的语法支持。

    FunTester
  • Groovy中的list

    在上一期从Java到Groovy的八级进化论中,我分享了Java是如何转变成Groovy。今天,我将分享学习Groovy对list的语法支持。

    FunTester
  • cssjshtml session和cookie的区别

    当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,

    葫芦
  • session与cookie的区别详解

    由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢?

    张树臣
  • [实战篇] Python 运维中使用并发

    今天从大哥手里接了一个需求: 验证一下新的 Docker 镜像仓库(Docker Registry)是否迁移成功了 简单粗暴的方法就是拿到老仓库中的镜像列表(I...

    临书
  • 集群下session共享问题的解决方案.

    一枝花算不算浪漫
  • Q118 Pascal's Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, giv...

    echobingo
  • C#嵌入x86汇编——一个GPIO接口的实现

    开始进入工业自动化,买的工控机带有GPIO接口,可用于直接控制继电器。 从厂家拿到接口手册一看,居然是汇编直接操作端口,基本上是IN/OUT指令了。接口很简单,...

    大石头
  • No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosing inst

    当时没有注意,仔细想了想,也是合理的。main是Test类的static方法,按照常理它只能访问Test类中static资源,而class A是非static所...

    Frank909

扫码关注云+社区

领取腾讯云代金券