java类中代码的执行顺序

来源:互联网 发布:c语言技巧 编辑:程序博客网 时间:2024/06/06 10:54

java类中代码的执行顺序

先看一下代码

package test;public class test1 {     static class A{         C c = new C();         public A(){             System.out.println("A类的构造方法");         }         static void eat(){             System.out.println("A类的静态方法");         }         static{                 System.out.println("A类的静态代码块");         }          void see(){              System.out.println("A类的普通方法");          }     }     static class B extends A{         public B(){             System.out.println("B类的构造方法");         }         static void eat(){             System.out.println("B类的静态方法");         }         static{             System.out.println("B类的静态代码块");         }         void see(){             System.out.println("B类的普通方法");         }     }     static class C{         public C(){             System.out.println("C类的构造方法");         }         static void eat(){             System.out.println("C类的静态方法");         }         void see(){             System.out.println("C类的普通方法");         }         static{             System.out.println("C类的静态代码块");         }     }     public static void main(String srgs[]){         B b = new B();         System.out.println("----------------------------------------------");         System.out.println("静态类不一定有静态方法,有静态方法的一定是静态类");         System.out.println("----------------------------------------------");         C.eat();         System.out.println("----------------------------------------------");         System.out.println("静态方法可以通过  “类名.方法名”的方式调用");         System.out.println("----------------------------------------------");         C c = new C();         c.see();     }}

执行结果如下

这里写图片描述

执行流程

Created with Raphaël 2.1.0Start父类中的静态代码块(初始化时执行一次)子类中的静态代码块(初始化时执行一次)父类中属性类的静态代码块(初始化时执行一次)父类中属性类的构造方法父类的构造方法子类中属性类的静态代码块(初始化时执行一次)子类中属性类的构造方法子类的构造方法end

我们来对执行结果分析一下

我们来看main函数中的语句

B b = new B();

首先,初始化B类,初始化B类前,会先初始化A类,之后再初始化B类,而静态代码块是在类初始化时加载的。
所以初始化B类的时候:也就是执行B b完成后,程序打印出:

A类的静态代码块B类的静态代码块

接下来执行new B();
因为B继承了A类,所以要先初始化A类的属性类,即:

C c = new C();

就会对C类进行初始化、实例化的过程,执行结果如下:

C类的静态代码块C类的构造方法

如果只是类的属性类的声明,如:

C c;

则不对C类进行初始化,更不会实例化

接着就开始执行A类的构造方法,程序输出结果:

A类的构造方法

父类完成后,开始对子类的属性初始化,以及属性结构方法的调用,最后完成子类的实例化。

参考博客

0 0