java的静态代码块、静态方法、构造方法执行过程

1、静态代码块:在方法区类加载的时候执行;如果一个类需要在加载的时候执行一段代码,可以在静态块中写入逻辑。代码块是自动执行的

2、构造方法:在对象实例化的时候执行。

3、静态方法:在类进行方法调用的时候执行。代码是被动调用执行的

 

它们在代码中具体的执行过程如下:

对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

 

 

当一个类中既有静态代码块,又有静态方法,构造方法的时候;例如Test2

public class Test2 {

    static {
        System.out.println("t2的静态代码块运行");
    }

    Test2(){
        System.out.println("t2的构造方法运行");
    }

    public static void method() {
        System.out.println("t2的静态方法执行了");
    }


}

 

1. 下面写一个测试类,执行Test2.method方法,控制台会输出什么了

public class StaticMethod {

    public static void main(String[] args) {

       Test2.method();

    }

}

控制台输出如下

t2的静态代码块运行
t2的静态方法执行了

 

 

2. 再写一个测试,执行Test2的构造方法,查看输出

public class StaticMethod {

    public static void main(String[] args) {

       Test2 test2 = new Test2();

    }

}

控制台输出如下:

t2的静态代码块运行
t2的构造方法运行

 

 

 

上述为一个类,当有两个类,一个类继承了另外一个类的时候,而且两个类都有上述方法的时候,会出现什么情况了 ???

下面写一个Test3继承Test2

public class Test3 extends Test2 {

    static {
        System.out.println("t3-----------静态代码的块运行");
    }

    Test3(){
        System.out.println("t3----------构造方法运行");
    }

    public static void method() {
        System.out.println("t3--------静态方法执行了");
    }


}

1. 下面写一个测试类,执行Test3.method方法,控制台会输出什么了

public class StaticMethod {

    public static void main(String[] args) {

       Test3.method();

    }

}

控制台输出如下:

t2的静态代码块运行
t3-----------静态代码的块运行
t3--------静态方法执行了

表明:在子类调用静态方法的时候,会先在方法区中加载父类,然后加载子类,最后执行子类的静态方法

 

2. 下面写一个测试类,执行执行Test3构造方法,控制台会输出什么了

public class StaticMethod {

    public static void main(String[] args) {

       Test3 test3 = new Test3();

    }

}

控制台输出如下:

t2的静态代码块运行
t3-----------静态代码的块运行
t2的构造方法运行
t3----------构造方法运行

发现,在子类进行实例化的时候,同样会现在方法区中完成类的加载过程;然后再调用子类的构造的方法,在调用子类的构造方法的时候,会隐士的调用父类的构造方法

 

 

最后补充:如果类中存在非静态的代码块,这个非静态的代码块会在对象初始化的触发执行,即构造方法运行之前运行,而且每一次初始化的时候都会运行一次;

如果只是执行了类的静态方法,不会触发类的非静态代码块。静态代码块在类加载的时候执行,而且只会执行一次

 

posted @ 2019-11-13 20:11  Java半路人生  阅读(450)  评论(0)    收藏  举报