`
zhengrenqi
  • 浏览: 2910 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类

静态代码块、非静态代码块、构造函数的执行顺序

    博客分类:
  • java
阅读更多
之前被面试问到父子类静态代码块、非静态代码块、构造函数
一直以来我我认为这三者的执行顺序是静态代码块、非静态代码块、构造函数。
网上搜了下也都是这么说的。
就像下面这段代码:
public class ExA {
	static {
		System.out.println("父类--静态代码块");
	}

	public ExA() {
		System.out.println("父类--构造函数");
	}

	{
		System.out.println("父类--非静态代码块");
	}

	public static void main(String[] args) {
		new ExB();
	}
}

class ExB extends ExA {
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}

	public ExB() {
		System.out.println("子类--构造函数");
	}
}

执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数

可是静态代码块真的会一定在非静态代码块之前执行吗?
下面这段代码
public class ExA {
	private static ExA a = new ExA();
	static {
		System.out.println("父类--静态代码块");
	}

	public ExA() {
		System.out.println("父类--构造函数");
	}

	{
		System.out.println("父类--非静态代码块");
	}

	public static void main(String[] args) {
		new ExB();
	}
}

class ExB extends ExA {
	private static ExB b = new ExB();
	static {
		System.out.println("子类--静态代码块");
	}
	{
		System.out.println("子类--非静态代码块");
	}

	public ExB() {
		System.out.println("子类--构造函数");
	}
}

执行结果
=====
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
=====
可以发现非静态代码块并不是一定在静态代码块之后执行的。
我认为此时private static ExA a = new ExA()是静态变量。而java里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。
分享到:
评论
2 楼 risemanjavaeye 2010-04-01  
《深入java虚拟机》里有很清楚的讲述,
1 楼 echozhjun 2010-03-09  
有点意思。

相关推荐

    静态代码块

    静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...

    java中静态代码块与构造方法的执行顺序判断

    在多级继承关系中,静态代码块按照类的加载顺序执行,先加载的类先执行其静态代码块。 例如,在给定的代码中: ```java public class A { static { System.out.print(1); } public A() { System.out.print(2)...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    深入浅析Java中普通代码块、构造代码块与静态代码块

    例如,在给定的示例中,静态代码块在程序启动时首先执行,然后是`main`方法,接着是构造代码块(每次创建对象时),最后是构造函数。如果类中还有其他类,如类`A`,那么`A`的静态代码块会在`structure`类的`main`...

    举例说明Java中代码块的执行顺序

    下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...

    Java类的完整构造执行顺序

    而类初始化则是指在类首次被使用时,JVM执行的一系列初始化操作,包括静态变量赋值、静态代码块执行等。 根据题目提供的内容,我们可以总结出Java类构造执行的详细步骤,这些步骤确保了类的正确初始化以及对象的...

    java中的static变量,方法,代码块

    2. 对象创建时,先执行类中的非静态代码块,再调用构造函数。 通过上述分析,我们可以清楚地看到`static`关键字在Java中是如何被运用的,及其在变量、方法和代码块管理上的独特优势。理解这些概念,对于编写高效、...

    JAVA程序:静态块代码

    它的执行顺序早于类的非静态初始化块和构造函数。当类第一次被加载时,静态块按照它们在代码中的顺序依次执行。 下面是一个简单的静态块示例,展示了如何使用静态块初始化静态变量: ```java public class ...

    java中静态与非静态的区别

    - 构造函数的执行顺序大致为:先分配静态成员的内存空间,然后执行静态成员初始化,接着执行静态构造函数;之后分配对象实例的内存空间,执行实例成员初始化,最后执行实例构造函数。 #### 三、静态成员与实例成员...

    Java——对象初始化顺序使用详解

    例如,如果在子类的静态代码块中依赖了父类的非静态字段,可能会导致错误,因为此时父类的实例还未被创建。此外,如果在构造代码块或构造函数中对字段进行了初始化,而字段已经在声明时被初始化,那么这两个初始化...

    详解java中的四种代码块

    // 非静态代码块 // ... } public Test3() { // 构造函数 // ... } } ``` 了解这四种代码块的使用方式和执行时机对于Java程序员来说是基础且重要的,它们可以帮助优化代码结构,提高代码效率,并确保在多...

    Java 八股文背诵版(113 道)

    - 详细的先后顺序:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数 7. Java 代码块执行顺序: ...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    java, java培训,团队转型技术培训

    - **类加载**:首先执行静态变量和静态代码块的初始化。 - **实例化**:接着执行成员变量的初始化,然后是构造代码块和构造方法。 类的执行顺序总结如下: 1. 静态变量的初始化 2. 静态代码块的执行 3. 成员变量...

    类继承的初始化顺序类,继承的初始化顺序

    3. **基类非静态成员初始化**:当创建一个子类对象时,会首先调用基类的构造函数来初始化基类的非静态成员变量。 4. **子类非静态成员初始化**:接着是子类的非静态成员变量初始化。 5. **基类构造函数调用**:通过`...

    在Java中自由块的执行顺序

    当一个类的实例被创建时,非静态自由块的代码会被插入到构造函数之前执行。这意味着,每次创建一个类的新对象,对应的非静态自由块就会被执行一次。例如,在类`Father`的非静态自由块中,`System.out.println(...

    实验指导20160418计算机软件及应用IT计算机专业资料.doc

    2. **构造代码块和静态代码块**:第二题展示了构造代码块和静态代码块的执行顺序。静态代码块只在类加载时执行一次,而构造代码块则在每次创建对象时执行。在`StudentDemo`类中,静态代码块在外包的初始化阶段执行,...

    继承与static精选例题

    1. **静态代码块与静态成员**:静态代码块只在类加载时执行一次,并且优先于任何对象的创建执行。静态成员也具有类似的特点,即与类而非对象关联。 2. **继承关系中的构造函数执行顺序**:在创建子类对象时,会先...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...

Global site tag (gtag.js) - Google Analytics