Java代码执行顺序
2014-03-11 15:11
483 查看
Java中不同类型代码是由严格的执行顺序的。
对于一个没有继承派生关系的类来说,它的代码执行顺序是这样的:
静态成员变量,静态代码块(两者以定义顺序来执行),成员变量,代码块,构造函数,成员函数。
如果有继承关系,那么子类中的调用顺序如下:
父类(静态成员变量,静态代码块),子类(静态成员变量,静态代码块),父类(成员变量,代码块),父类构造函数,子类(成员变量,代码块),子类构造函数。
请看下面两个类的声明。
父类:
public class Parent {
final static int x = 0;
final static int y;
final int z;
static {
System.out.println("Parent Static code");
y = 5;
//z = 6; //Cannot make a static reference to the non-static field z
}
final int a;
{
System.out.println("Parent Dynamic code");
a = 3;
b = 4;
//System.out.println("b = " + b); //Cannot reference a field before it is defined
}
final int b;
//final static int c; //The blank final field c may not have been initialized
public Parent() {
z = 6;
//c = 6; //The final field Parent.c cannot be assigned
System.out.println("Parent Constructor code");
}
public void method() {
System.out.println("Parent method");
}
}
子类:
public class Son extends Parent {
int sX;
final int sY;
static final int sZ;
{
sX = 1;
sY = 2;
System.out.println(sX);
System.out.println(sY);
System.out.println("Son Dynamic model 1");
}
static {
sZ = 1;
System.out.println(sZ);
//System.out.println(sC);
System.out.println("Son Static model 1");
}
int sA = 0;
final int sB = 1;
static final int sC = 2;
int sD;
final int sE;
static final int sF;
{
sE = 3;
System.out.println(sE);
System.out.println("Son Dynamic model 2");
}
static {
sF = 1;
System.out.println(sF);
//System.out.println(sC);
System.out.println("Son Static model 2");
}
int sH;
final int sI;
static int sJ;
public Son() {
sH = 3;
sI = 4;
sJ = 6;
System.out.println("Son constructor");
}
public void method() {
System.out.println("Son method");
}
}
假设在调用函数中有如下代码:
Parent p1 = new Son();
p1.method();
Parent p2 = new Parent();
p2.method();
Son s1 = new Son();
s1.method();
其执行输出如下:
Parent Static code
1
Son Static model 1
1
Son Static model 2
Parent Dynamic code
Parent Constructor code
1
2
Son Dynamic model 1
3
Son Dynamic model 2
Son constructor
Son method
Parent Dynamic code
Parent Constructor code
Parent method
Parent Dynamic code
Parent Constructor code
1
2
Son Dynamic model 1
3
Son Dynamic model 2
Son constructor
Son method
对于一个没有继承派生关系的类来说,它的代码执行顺序是这样的:
静态成员变量,静态代码块(两者以定义顺序来执行),成员变量,代码块,构造函数,成员函数。
如果有继承关系,那么子类中的调用顺序如下:
父类(静态成员变量,静态代码块),子类(静态成员变量,静态代码块),父类(成员变量,代码块),父类构造函数,子类(成员变量,代码块),子类构造函数。
请看下面两个类的声明。
父类:
public class Parent {
final static int x = 0;
final static int y;
final int z;
static {
System.out.println("Parent Static code");
y = 5;
//z = 6; //Cannot make a static reference to the non-static field z
}
final int a;
{
System.out.println("Parent Dynamic code");
a = 3;
b = 4;
//System.out.println("b = " + b); //Cannot reference a field before it is defined
}
final int b;
//final static int c; //The blank final field c may not have been initialized
public Parent() {
z = 6;
//c = 6; //The final field Parent.c cannot be assigned
System.out.println("Parent Constructor code");
}
public void method() {
System.out.println("Parent method");
}
}
子类:
public class Son extends Parent {
int sX;
final int sY;
static final int sZ;
{
sX = 1;
sY = 2;
System.out.println(sX);
System.out.println(sY);
System.out.println("Son Dynamic model 1");
}
static {
sZ = 1;
System.out.println(sZ);
//System.out.println(sC);
System.out.println("Son Static model 1");
}
int sA = 0;
final int sB = 1;
static final int sC = 2;
int sD;
final int sE;
static final int sF;
{
sE = 3;
System.out.println(sE);
System.out.println("Son Dynamic model 2");
}
static {
sF = 1;
System.out.println(sF);
//System.out.println(sC);
System.out.println("Son Static model 2");
}
int sH;
final int sI;
static int sJ;
public Son() {
sH = 3;
sI = 4;
sJ = 6;
System.out.println("Son constructor");
}
public void method() {
System.out.println("Son method");
}
}
假设在调用函数中有如下代码:
Parent p1 = new Son();
p1.method();
Parent p2 = new Parent();
p2.method();
Son s1 = new Son();
s1.method();
其执行输出如下:
Parent Static code
1
Son Static model 1
1
Son Static model 2
Parent Dynamic code
Parent Constructor code
1
2
Son Dynamic model 1
3
Son Dynamic model 2
Son constructor
Son method
Parent Dynamic code
Parent Constructor code
Parent method
Parent Dynamic code
Parent Constructor code
1
2
Son Dynamic model 1
3
Son Dynamic model 2
Son constructor
Son method
相关文章推荐
- java代码执行顺序
- Java类代码执行顺序
- 一个关于继承关系中静态快、成员变量、构造体代码的执行顺序的Java代码
- 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)
- Java基础-代码执行顺序(重要)
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
- JAVA代码执行顺序
- Java中创建对象时,初始化成员变量的代码的执行顺序
- Java代码执行顺序
- jsp中java代码、jsp代码、js代码执行的顺序
- 在后台JAVA代码中执行打乱集合顺序的方法
- java中代码执行顺序
- java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
- JAVA代码中加了Try...Catch的执行顺序
- 【自动化测试】java测试代码里面的执行顺序
- java代码执行的顺序
- java代码执行顺序
- jsp中java代码、jsp代码、js代码执行的顺序
- Java父子类静态代码/非静态代码/构造函数执行顺序
- Java类中代码的执行顺序 静态代码块>构造代码块>构造方法