Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序
2012-12-07 10:16
309 查看
执行顺序的规则:
一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。
二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。
三、按声明顺序将成员引用对象变量初始化。
四、最后调用自身的构造方法。
五、同一个类中的static代码块,代码块,构造函数的执行顺序此顺序执行,static代码块与代码块的区别是static代码块只执行一次。
下面以一个例子来说明代码如下:
解释:
输出第2行:class cat 是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第一句。
输出第5、7行:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。
输出第3、4、5、6、7行:同一个类中static代码块,代码块,构造函数的执行顺序及static代码块只执行一次。验证第五句。
输出第8行:super Tom class Animal construct 执行父类的构造函数,因为用super("")。
输出第9行:The dog's number is:0 可以看出子类的dogNumber还是默认值0
输出第10、11、12行:class Animal default construct和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。
输出第13、14行:class Dog 和The dog's number is:10是执行自己的构造函数。
一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。
二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。
三、按声明顺序将成员引用对象变量初始化。
四、最后调用自身的构造方法。
五、同一个类中的static代码块,代码块,构造函数的执行顺序此顺序执行,static代码块与代码块的区别是static代码块只执行一次。
下面以一个例子来说明代码如下:
package com.dxz; class Animal { String name; Animal() { System.out.println("class Animal default construct"); } Animal(String name) { this.name = name; System.out.println(name + " class Animal construct"); printNumber(); } public void printNumber() { } } package com.dxz; public class Fish extends Animal { Fish() { System.out.println("class Fish"); } } package com.dxz; public class GoldFish extends Fish { GoldFish() { System.out.println("class GoldFish"); } } package com.dxz; public class Cat { Cat(){ System.out.println("class cat"); } } package com.dxz; public class Rabbit { private static int number; private static Cat cat = new Cat();//静态成员先执行 public Rabbit() { number++; System.out.println(number + "class rabbit"); } static { System.out.println("static Rabbit"); } { System.out.println("I'm a Rabbit"); } } package com.dxz; public class Dog extends Animal { public int dogNumber; private GoldFish goldFish = new GoldFish(); static Rabbit blackRabbit = new Rabbit(); static Rabbit whiterabbit = new Rabbit(); public Dog() { super("super Tom"); System.out.println("class Dog"); dogNumber = 10; System.out.println("The dog's number is:" + dogNumber); } public void printNumber(){ System.out.println("The dog's number is:" + dogNumber); } } package com.dxz; public class TestInheritanceConstructor extends Animal { public static void main(String[] args){ System.out.println("---------------begin---------"); new Dog(); } }
//结果: 1:---------------begin--------- 2:class cat 3:static Rabbit 4:I'm a Rabbit 5:1class rabbit 6:I'm a Rabbit 7:2class rabbit 8:super Tom class Animal construct 9:The dog's number is:0 10:class Animal default construct 11:class Fish 12:class GoldFish 13:class Dog 14:The dog's number is:10
解释:
输出第2行:class cat 是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第一句。
输出第5、7行:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。
输出第3、4、5、6、7行:同一个类中static代码块,代码块,构造函数的执行顺序及static代码块只执行一次。验证第五句。
输出第8行:super Tom class Animal construct 执行父类的构造函数,因为用super("")。
输出第9行:The dog's number is:0 可以看出子类的dogNumber还是默认值0
输出第10、11、12行:class Animal default construct和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。
输出第13、14行:class Dog 和The dog's number is:10是执行自己的构造函数。
相关文章推荐
- Java 成员变量 静态块 构造块 构造方法执行顺序测试
- Java普通代码块,构造代码块,静态代码块,成员变量的执行顺序的代码实例
- Java static属性和静态代码块和构造方法等的执行顺序探讨
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java中的static变量、方法、代码块初始化执行顺序
- Java中静态块,静态成员变量,构造块,普通成员变量,构造方法的执行顺序
- java 动态绑定及成员变量、构造方法,static方法,private,final方法前期绑定
- java静态代码块、初始化块和构造方法的执行顺序
- java静态代码块、初始化块和构造方法的执行顺序
- java中静态代码块和构造方法执行顺序
- 继承中,static代码块,代码块,构造方法执行顺序问题
- java程序中代码块与构造方法的执行顺序
- 构造函数初始化、static代码块初始化、成员变量初始化、以及在子父类中混合的执行顺序实例
- 关于static语句,构造代码块,构造方法的执行顺序
- java静态代码块、初始化块和构造方法的执行顺序解析
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨
- [置顶] Java中静态代码块、非静态代码块、构造方法三者的执行顺序
- Java中构造代码块和成员变量初始化的顺序关系2之 Cannot reference a field before it is defined
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
- Java静态代码块和构造方法执行顺序