`
L.G.Alexander
  • 浏览: 155880 次
  • 性别: 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 静态非静态 字段方法 子类父类构造_初始化顺序!

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

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

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    有关static block静态代码块和单态设计模式

    静态代码块(static block ),不包含在任何方法体中当类被载入时,自动执行静态代码块,且只被执行一次经常用于类属性的初始化。 这是网上通行的关于静态代码块的定义。 在Java中,类装载器把一个类装入Java虚拟机...

    简单了解java中静态初始化块的执行顺序

    主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java类中各成员初始化的顺序

    out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println("父类静态方法" ); ...

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....

    JAVA面试题解惑系列

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    杰普学习corejava总结笔记

    执行静态代码块 3.分配内存空间,同时初始化非静态的属性(赋默认值) 4.调用父类构造器(注意调用父类构造器之前已经给父类的非静态的属性显示赋值,如果有显示赋值的话) 5.父类构造器执行完后,如果自己声明属性的...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    疯狂JAVA讲义

    5.9.3 静态初始化块 162 5.10 本章小结 165 本章练习 165 第6章 面向对象(下) 166 6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    javacore:java核心 运算符,控制语句,函数,异常,集合,线程,数组,IO流,网路编程,设计模式,java8,面试相关

    静态初始化 数组的特点 面向对象 对象的创建 成员变量和局部变量 匿名对象 面向对象的三大特征 构造函数 代码块 代码块的说明 this关键字 static关键字 使用static关键字统计类的创建次数 面向对象 main函数 设计...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    超爽的自学课件(java)

    在这一章的最后,我们将更贴近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。 <br>(5) 第5章:隐藏实现过程 本章要探讨将代码封装到一起的方式...

Global site tag (gtag.js) - Google Analytics