Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块、构造代码块、构造方法的执行顺序

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。

执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步

1,super语句,可能出现以下三种情况:

1)构造方法体的第一行是this语句,则不会执行隐式三步,

2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,

3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;

2,初始化非静态变量

3,构造代码块

由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。

例如,分析下面的代码及执行结果,已经用注释标出了执行步骤Step 1–Step 7。

也就是说,当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!

public class Test {
    public static int a = 0;

    static {// Step 1
        a = 10;
        System.out.println("静态代码块在执行a=" + a);
    }

    {// Step 4
        a = 8;
        System.out.println("非静态代码块(构造代码块)在执行a=" + a);
    }

    public Test() {
        this("调用带参构造方法1,a=" + a); // Step 2
        System.out.println("无参构造方法在执行a=" + a);// Step 7
    }

    public Test(String n) {
        this(n, "调用带参构造方法2,a=" + a); // Step 3
        System.out.println("带参构造方法1在执行a=" + a); // Step 6
    }

    public Test(String s1, String s2) {
        System.out.println(s1 + ";" + s2);// Step 5
    }

    public static void main(String[] args) {
        Test t = null;// JVM加载Test类,静态代码块执行
        System.out.println("下面new一个Test实例:");
        t = new Test();
    }
}

执行结果:

静态代码块在执行a=10
下面new一个Test实例:
非静态代码块(构造代码块)在执行a=8
调用带参构造方法1,a=10;调用带参构造方法2,a=10
带参构造方法1在执行a=8
无参构造方法在执行a=8

http://bbs.csdn.net/topics/391001417

时间: 2024-10-12 17:33:54

Java静态代码块、构造代码块、构造方法的执行顺序的相关文章

Java 代码块,普通代码块,构造代码块,静态代码块

学习Java中… 刚刚学到了Java的代码块,虽然很简单 还是记下吧! 左音 2016-03-16 ----------------- // 执行优先级:静态代码块 > mian方法 > 构造代码块 > 构造方法 // 静态代码块不论是否实例化都会执行一次,不会重复执行 // 构造代码块实例化时执行 1.普通代码块 // 普通代码块在方法或语句中 1 public class CodeBlock { 2 3 public static void main (String[] args)

【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("执行Person静态代码块"); } { System.out.println("执行Person构造代码块"); } public Person(){ System.out.println("执行Person构

静态代码块-普通代码块-构造代码块(好多图系列)

执行main函数之后,结果如下: 静态代码块main函数执行构造代码块2222无参构造函数1111111普通代码块 注意点:构造代码块和普通代码块的区别? ====>构造代码块是放在类上的,普通代码块是放在方法上的 执行顺序: 静态代码块>main>构造代码块>构造函数>111111>普通代码块 这里指的注意是红色的部分.我们可以利用他去做一些执行完构造函数之后的操作,而且是在编写代码的时候传进去的! 原文地址:https://www.cnblogs.com/vingL

关于静态块、静态属性、构造块、构造方法的执行顺序

总结: 1.类加载时,执行静态代码块和初始化静态变量.执行顺序跟代码顺序一致. 2.类实例化时,初始化变量.执行代码块.执行构造.其中初始化变量和代码块的顺序跟代码顺序一致.执行构造是在最后. 3.实例化子类时,会先调用父类的构造方法.调用构造方法之前,会先执行该类的代码块. 4.类只会加载一次. 5.静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看.但会先执行一遍代码块. 下面是在网上找到的比较典型的例子,以此来说明 例一: class A { static { System.

静态块、main方法、构造块、构造方法的执行顺序

在牛客网做题,遇到关于静态块.main方法.构造块.构造方法的执行顺序的问题,添加该随笔记之. 题目是写出如下java代码执行后所打印的顺序: 1 public class B 2 { 3 public static B t1 = new B(); 4 public static B t2 = new B(); 5 { 6 System.out.println("构造块"); 7 } 8 static 9 { 10 System.out.println("静态块")

Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法.   Class ThisClass{ } 默认隐式添加无参的构造方法,相当于 Class ThisClass{ public ThisClass(){ } } 2.构造方法的执行顺序.     (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法. public ThisClass(){ } 默认隐式添加父类无参构造方法,相当于

Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象 2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用 3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块. 类初始化时构造方法执行顺序 对于某一个子类时: (1)初始化对象的存储空

java普通代码块、静态代码块、默认构造方法的执行顺序

1 package test; 2 3 class Parent{ 4 { 5 System.out.println("父类普通代码块"); 6 } 7 static{ 8 System.out.println("父类静态代码块"); 9 } 10 public Parent(){ 11 System.out.println("父类默认构造代码方法"); 12 } 13 } 14 class Child extends Parent{ 15 {

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu