您的位置:首页 > 编程语言 > Java开发

Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序

2012-12-07 10:16 309 查看
执行顺序的规则:

一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。

二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法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是执行自己的构造函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐