程序的执行顺序
1. 执行父类的静态块和静态属性(执行顺序:按照程序的排列顺序执行)→
执行子类的静态块和静态属性(执行顺序:按照程序的排列顺序执行)→
执行主函数new对象前面的输出语句和非静态块(执行顺序:按照程序的排列顺 序执行)→
父类的属性和非静态块(执行顺序:按照程序的排列顺序执行)→
父类的构造器→
子类的属性和非静态块(执行顺序:按照程序的排列顺序)→
子类的构造器→
new结束,执行new后面的语句
下面我将给出一个程序来验证我上面的执行顺序是否正确
1.
package com.cl.ft.text;
//子类T继承父类X
public class T extends X{
//子类静态块
static {
System.out.println("我是子类的静态块A");
}
//子类静态属性
static B r = new B();
//子类非静态块
{
System.out.println("我是子类的非静态的块");
}
//子类的静态方法
public static void Assa (){
System.out.println("我是子类的静态方法");
}
//子类的非静态属性
Y y=new Y();
//子类的无参构造器
public T(){
//调用父类的有参构造器
super(5);
System.out.println("我是子类的无参构造器");
}
public static void main(String[] args) {
System.out.println("我是主函数new对象前面的");
//主函数的非静态块
{
System.out.println("我是主函数new前面的非静态块");
}
//new一个父类对象
X r = new X();
//new一个子类对象
T q = new T();
System.out.println("我是主函数new对象后面的add");
//new对象后面的非静态块
{
System.out.println("我是主函数new后面的非静态块");
}
}
}
//父类X
class X{
//父类静态块
static {
System.out.println("我是父类的静态块B");
}
//父类静态属性
static B t = new B();
//父类非静态属性
B d = new B();//属于X的属性
//父类非静态块
{
System.out.println("我是父类的非静态块");
}
//父类的静态方法
public static void Ass (){
System.out.println("我是父类的静态方法");
}
//父类的非静态属性
B b = new B();//属于X的属性
Y y=new Y();
//父类的无参构造器
public X(){
System.out.println("X我是父类无参的构造方法");
}
//父类的有参构造器
public X(int i){
System.out.println("我是父类有参的构造方法");
}
}
class Y{
public Y(){
System.out.println("YY");
} 2. package com.cl.ft.text;
public class B {
B (){
System.out.println("zz");
} 运行结果 由于运行结果复制不能显示字母我就用截图给大家看 我会把源代码和截图都给你大家,一张图片,一个压缩包,里面有两个文件。运行的结果有点长,大家要是觉得有点晕,可以先注释大部分语句,一点一点增加语句来比较性的查看运行结果,这个需要大家自己操作运行,这样理解的更加深刻一点,如果有不懂的可以给我留言,我会尽量最快来回复大家的疑问。谢谢大家!!!
zz
YY
}
}