`
L.G.Alexander
  • 浏览: 158438 次
  • 性别: 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 普通代码块静态代码块执行顺序(实例讲解)

    这里我们将深入探讨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. 开发者应当注意静态成员的初始化顺序,避免在继承...

    关于Java中静态代码块的执行浅析

    在上面的示例中,静态代码块将在第一次初始化对象、第一次调用静态方法或第一次调用静态代码块下面的静态变量时执行。 静态代码块是一种非常有用的机制,可以用来执行一些需要在类加载时执行的代码。了解静态代码块...

Global site tag (gtag.js) - Google Analytics