博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造方法调用顺序
阅读量:5282 次
发布时间:2019-06-14

本文共 2714 字,大约阅读时间需要 9 分钟。

 

 

其中:静态成员和Static块初始化按照出现的顺序,普通成员初始化和非static块也按照顺序。

父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法--> 派生类的其他成员变量 --> 派生类构造方法--> ...............-->子类其他成员变量-->子类构造方法

public class Test04 ...{    private static Test04 t1 = new Test04();    private static int i1;    private static int i2 = 2;        public Test04()...{        i1++;        i2++;    }        public static void main(String[] args) ...{        Test04 t2 = new Test04();        System.out.println("t2.i1 = " + t2.i1);        System.out.println("t2.i2 = " + t2.i2);    }}我们先预计一下输出,可能有几种答案:2和3,3和3,2和2执行代码后:t2.i1 = 2t2.i2 = 3

其实代码的执行顺序是这样的:首先执行给t1,i1,i2分别给予初始值null,0,0,再执行

Test04 t1 =new Test04(),这样i1++,i2++被执行,i1,i2都变为1,执行完毕后接着执行int i1; i1,i2的值仍然是1,1,当执行int i2 = 2时i2被赋予了值,即i1 = 1,i2=2;再执行Test04 t2 = new Test04(),i1,i2再执行++,此时i1 =2,i2 =3,输出i1,i2,结果就是:t2.i1 = 2,t2.i2 = 3。 通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。再看个扩展的例子:

//Aclass A{        private static A t1 = new A();        private static int i1;        private static int i2 = 2;                public static A getT1() {            return t1;        }        public static void setT1(A t1) {            A.t1 = t1;        }        public static int getI1() {            return i1;        }        public static void setI1(int i1) {            A.i1 = i1;        }        public static int getI2() {            return i2;        }        public static void setI2(int i2) {            A.i2 = i2;        }        public A(){            i1++;            i2++;        }    }  //Bclass B{                private static int i1;        private static int i2 = 2;        private static B t1 = new B();        //方法同上。。。。    }  //Cclass C{                private static int i1;        private static C t1 = new C();        private static int i2 = 2;          //方法同上。。。。    }  //testimport static org.junit.Assert.*;import org.junit.Test;public class test {    @Test    public void testA(){        A t2 = new A();        assertEquals(t2.getI1(),2);        assertEquals(t2.getI2(),3);    }    @Test    public void testB(){        B t2 = new B();        assertEquals(t2.getI1(),2);        assertEquals(t2.getI2(),4);    }    @Test    public void testC(){        C t2 = new C();        assertEquals(t2.getI1(),2);        assertEquals(t2.getI2(),3);    }    }

 

 说明:要区别ABC的区别,主要注意静态成员变量的初始化顺序不同,

当private static A t1 = new A()执行之前,i1=0,i2=0;执行之后,i1=1,i2=1;之后执行private static int i1; private static int i2 = 2;i1=1,i2=2;之后A t2 = new A();

当private static B t1 = new B()执行之前,i1=0,i2=2;执行之后,i1=1,i2=3;B t2 = new B();

当private static C t1 = new C()执行之前,i1=0,i2=0;执行之后,i1=1,i2=1;private static int i2 = 2;i1=1,i2=2;C t2 = new C();

转载于:https://www.cnblogs.com/seven7seven/p/3728687.html

你可能感兴趣的文章
第一次作业
查看>>
WPF 仿IPhone滑块开关 样式 - CheckBox
查看>>
Unable to create an instance of the Java Virtual Machine
查看>>
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
查看>>
深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)...
查看>>
div最低高度设置
查看>>
Chrome浏览器正常,IE下界面却乱了
查看>>
关于不断刷新界面jsp+ajax
查看>>
课程总结
查看>>
storm常见问题
查看>>
java开发中使用的工厂设计模式
查看>>
struct和typedef
查看>>
3.22上午,
查看>>
解决ajax跨域问题(转自六只)
查看>>
30个必须记住的css选择器
查看>>
【BZOJ1008】1008: [HNOI2008]越狱 简单组合数学+快速幂
查看>>
Java 反射机制浅析
查看>>
HDU 1017—A Mathematical Curiosity
查看>>
分库分表的基本思想
查看>>
gcc/g++ 如何支持c11 / c++11标准编译
查看>>