`

java 静态块 非静态块

阅读更多

转自:http://blog.sina.com.cn/s/blog_499b09000100d9rj.html

 

静态块static block

//c4:StaticBlock1.java

//author:ZhangHongbin

//This program is protected by copyright laws.

//Static block. 

public class StaticBlock1

{

       static

       {

              System.out.println("static block");

       }

       public static void main(String[] args)

       {

       }

}

非静态块(non-static block

//c4:NonStaticBlock1.java

//author:ZhangHongbin

//This program is protected by copyright laws.

//Non-Static block. 

public class NonStaticBlock1

{

       {

              System.out.println("Non static block");

       }

       NonStaticBlock1()

       {

              System.out.println("constructor");

       }

       public static void main(String[] args)

       {

              new NonStaticBlock1();

       }

}

/**

静态块一般用于初始化类中的静态成员;而非静态块一般用于初始化类中的非静态成员;

另外,非静态块是在创建对象时自动执行的代码。(静态块应该是在类加载的时候执行。)

 

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();//语句(*)
 }
}

 

顺序应该是这样的:父类Static->子类static->父类缺省{}->父类构造函数->子类缺省{}->子类构造函数
所以上面的例子打印顺序应该是这样的:
parent static block 父类Static
child static block 子类static
parent  block 父类缺省{}
parent constructor 父类构造函数
child  block子类缺省{}
child constructor子类构造函数

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

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

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过

分享到:
评论

相关推荐

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

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

    java静态代码块与非静态代码块参照.pdf

    java静态代码块与非静态代码块参照.pdf

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

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

    Java的静态代码块、非静态代码块、构造函数

    Java的静态代码块、非静态代码块、构造函数的简单的java代码

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

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

    java类中静态域、块,非静态域、块,构造函数的初始化顺序,通过本例子,能够清楚了解到java类的初始化顺序

    Java中的静态变量、静态方法与静态代码块

    而非静态代码则在类的使用阶段(也是实例化一个类的时候)才会被初始化。  静态变量  可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。  静态变量有两种情况:  ● 静态...

    static静态变量使用@Value注入方式.md

    MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    上次有朋友问我,java中的类...我给他肯定的回答是可以的,在java中我们可以有静态实例变量、静态方法、静态块。当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之家平台供大家参考

    java 多线程设计模式 进程详解

    同步块 嵌套锁 死锁 返回到银行的例子 同步静态方法 总结 第四章 等待和通知 返回到银行的例子 等待和通知 wait()、notify()和notifyAll() wait()和sleep() 线程中断 静态方法(有关同步的细节) 总结 ...

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

    staticBlock.java 演示静态块的使用 staticVar.java 定义静态变量 supplyTest.java 对象作为静态成员使用示例 trySwap.java 试图交换两个形参的值 useOnlyTest.java 创建多个对象,演示this的作用 ...

    疯狂JAVA讲义

    学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 ...

    在Java中自由块的执行顺序

    java中的自由块分为静态的自由块和非静态的自由块。非静态自由块的执行时间是:在执行构造函数之前。静态自由块的执行时间是:class文件加载时执行。

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

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    java基础案例与开发详解案例源码全

    8.1.1 非静态成员内部类203 8.1.2 局部内部类206 8.1.3 静态内部类209 8.1.4 匿名内部类211 8.2 对象包装器213 8.3 装箱和拆箱216 8.4 本章习题218 第9章 9.1 String类220 9.1.1 字符串常量221 9.1.2 字符串对象操作...

    Java经典面试题.pdf

    静态方法无法访问非静态成员。 4.什么是Java的final关键字? final关键字用于修饰类、方法和变量。 修饰类:被final修饰的类无法被继承。 修饰方法:被final修饰的方法无法被子类重写。 修饰变量:被final修饰...

    杰普学习corejava总结笔记

    调用父类构造器(注意调用父类构造器之前已经给父类的非静态的属性显示赋值,如果有显示赋值的话) 5.父类构造器执行完后,如果自己声明属性的同时有显示的赋值,那么进行显示赋值把默认值覆盖 6.执行匿名代码块 7....

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

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

Global site tag (gtag.js) - Google Analytics