本人在作接口測試的時候,須要用一個公共類來把全部的執行的代碼,而後這個公共類有hsot和hosttype等屬性來區分各個測試環境,而後在去不一樣的地方取用例和請求接口。在給這些屬性複製的時候,我是經過不一樣測試環境新建不一樣的配置文件,而後執行每一個環境的時候讓只加載須要測試的環境的配置文件來實現管理測試環境的。中間遇到了一些坑,主要就是對java代碼執行循序,特別是在main方法以前的代碼執行順序瞭解不深刻致使的,中間有多個繼承關係也有點擾亂了思路。下面分享一下本身這個錯誤的復現步驟。java
首先放一下一個單獨的類的代碼執行順序,下面是代碼:編程
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靜態代碼塊!"); } }
下面是執行結果:json
我是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。3d
下面是測試代碼:code
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