再次详细说明在继承中的程序执行顺序,子类与父类到底哪个先执行

程序的执行顺序

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                                            

 

 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

你可能感兴趣的:(Java语言基础)