`
L.G.Alexander
  • 浏览: 157259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(四): Java中静态代码块及对象的初始化顺序

阅读更多
class Parent{
	static String name = "hello";
	{
		System.out.println("parent  block");
	}
	static {
		System.out.println("parent static block");
	}
	public Parent(){
		System.out.println("parent constructor");
	}
}

class Child extends Parent{
	static String childName = "hello";
	{
		System.out.println("child  block");
	}
	static {
		System.out.println("child static block");
	}
	public Child(){
		System.out.println("child constructor");
	}
}

public class StaticIniBlockOrderTest {

	public static void main(String[] args) {
        new Child();//语句(*)
	}
}

问题:当执行完语句(*)时,打印结果是什么顺序?为什么?
解答:当执行完语句(*)时,打印结果是这样一个顺序:parent static block,child static block,parent  block,parent constructor,child  block,child constructor。
分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静态代码块,当子类的静态代码块执行完毕之后,它接着又去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法,这个就是一个对象的初始化顺序。

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

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
分享到:
评论
7 楼 L.G.Alexander 2009-02-28  
顺序应该是这样的:父类Static->子类static->父类缺省{}->父类构造函数->子类缺省{}->子类构造函数
所以上面的例子打印顺序应该是这样的:
parent static block 父类Static
child static block 子类static
parent  block 父类缺省{}
parent constructor 父类构造函数
child  block子类缺省{}
child constructor子类构造函数
6 楼 zhxing 2009-02-28  
想起来了。。看了以前总结的笔记:父类Static->子类static->缺省{}->构造函数

parent static block
child static block
parent  block
child  block
parent constructor
child  block,child constructor

顺序该是这样的..对吧
5 楼 L.G.Alexander 2009-02-27  
{ 
         System.out.println("child block"); 
     } 
  
这样的代码是在静态代码块初始化之后,构造方法初始化之前初始化的!
4 楼 zhxing 2009-02-27  
stanfine 写道
 class Parent{  
     static String name = "hello";  
     static {  
         System.out.println("parent static block");  
     }
     {
         System.out.println("parent block"); 
     }
     public Parent(){  
         System.out.println("parent constructor");  
     }  
 }  
   
 class Child extends Parent{  
     static String childName = "hello";  
     static {  
         System.out.println("child static block");  
     }
     {
         System.out.println("child block"); 
     }  
     public Child(){  
         System.out.println("child constructor");  
     }  
 }  
   
 public class StaticIniBlockOrderTest {  
   
     public static void main(String[] args) {  
         new Child();//语句(*)  
     }  
 } 

好象这样更加全!



原来见过类似题目。。 
{
         System.out.println("child block");
     }   
这样的代码是几时初始化的呢?有些忘了。
3 楼 L.G.Alexander 2009-02-27  
不错不错,欢迎大家批评指正!
2 楼 xiespirit 2009-02-27  
stanfine 写道
 class Parent{  
     static String name = "hello";  
     static {  
         System.out.println("parent static block");  
     }
     {
         System.out.println("parent block"); 
     }
     public Parent(){  
         System.out.println("parent constructor");  
     }  
 }  
   
 class Child extends Parent{  
     static String childName = "hello";  
     static {  
         System.out.println("child static block");  
     }
     {
         System.out.println("child block"); 
     }  
     public Child(){  
         System.out.println("child constructor");  
     }  
 }  
   
 public class StaticIniBlockOrderTest {  
   
     public static void main(String[] args) {  
         new Child();//语句(*)  
     }  
 } 

好象这样更加全!


不错,不错.
1 楼 stanfine 2009-02-27  
 class Parent{  
     static String name = "hello";  
     static {  
         System.out.println("parent static block");  
     }
     {
         System.out.println("parent block"); 
     }
     public Parent(){  
         System.out.println("parent constructor");  
     }  
 }  
   
 class Child extends Parent{  
     static String childName = "hello";  
     static {  
         System.out.println("child static block");  
     }
     {
         System.out.println("child block"); 
     }  
     public Child(){  
         System.out.println("child constructor");  
     }  
 }  
   
 public class StaticIniBlockOrderTest {  
   
     public static void main(String[] args) {  
         new Child();//语句(*)  
     }  
 } 

好象这样更加全!

相关推荐

    Java静态初始化块和对象初始化块

    静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...

    java代码的初始化顺序demo

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

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

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

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

    java静态代码块与非静态代码块.doc

    静态代码块是在类加载时自动执行的,通常用于初始化一些项目最常用的变量或对象,而非静态代码块是在创建对象时自动执行的,通常用于初始化对象的状态。同时,静态方法和静态代码块也有一些区别,静态方法需要被调用...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...

    Java类继承初始化顺序

    总之,Java类继承初始化顺序涉及到静态和非静态初始化块、构造器的调用以及方法的覆盖。理解这些概念对于编写健壮的、易于维护的Java代码至关重要。在实际编程中,应合理利用继承特性,同时注意避免不必要的复杂性和...

    Java静态代码块作用及执行顺序解析

    Java静态代码块作用及执行顺序解析 Java静态代码块是Java语言中的一种特殊代码块,它们在类加载的时候执行,且只执行一次。它们通常用来初始化静态变量、设置静态变量的初始值等。静态代码块的作用域是整个类,而...

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

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

    Java面向对象(高级)- 类的成员之四:代码块

    静态代码块适用于类级别的初始化,而非静态代码块则适用于对象级别的初始化。熟练掌握这些概念有助于编写更高效和清晰的Java代码。在实际编程中,应根据需求合理利用代码块,确保对象在正确的时间得到正确的初始化。

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

    Java 普通代码块静态代码块执行顺序(实例讲解)

    这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块的执行顺序,并通过实例来阐述这一概念。 首先,我们需要明白两种类型的代码块: 1. 静态代码块(Static Block):这些代码块在类加载时执行,...

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

    显式初始化指的是在静态代码块中赋值,例如 `static { x = 10; }`。 在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序...

    Java初始化块Java初始化块.doc

    Java 初始化块,也称为构造代码块,是Java编程语言中的一种特性,用于在对象创建时执行特定的初始化操作。初始化块在类的定义中以 `{}` 包裹的一段代码,没有返回值,也不需要任何参数。根据是否带有 `static` ...

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

    在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会有一个特定的初始化顺序。这个顺序通常遵循以下步骤: 1. **基类静态成员初始化**:如果基类中有任何静态成员,则会在程序启动时按照...

    C++和Java初始化顺序的比较代码

    MyClass() : b(2), a(1) {} // 初始化顺序:b -> a }; int MyClass::c = 0; // 静态成员初始化 ``` 在这个例子中,`b` 先于 `a` 被初始化,而静态成员 `c` 在类实例化之前已经初始化。 在Java中,初始化顺序则有所...

    静态代码块

    静态代码块是Java语言中的一个重要概念,主要用于初始化类级别的数据成员或执行一些仅需执行一次的操作。静态代码块通过`static`关键字来定义,在类加载时执行,且只执行一次。这与实例构造器或普通代码块不同,后者...

    JAVA面试题解惑系列——类的初始化顺序

    1. 单个类内成员的初始化顺序:静态变量、静态初始化块、变量、初始化块、构造器。 2. 在继承关系中,子类的静态成员会在父类的非静态成员初始化之前被初始化。 3. 开发者应当注意静态成员的初始化顺序,避免在继承...

Global site tag (gtag.js) - Google Analytics