初始化代码块和构造器的执行顺序

 1 package Lab5;
 2
 3
 4 class Root{
 5         static{
 6             System.out.println("Root的静态初始化");
 7         }
 8         {
 9             System.out.println("Root普通初始化代码");
10         }
11          public Root(){
12              System.out.println("root 无参数构造方法");
13          };
14 }
15
16 class Mid extends Root{
17
18     static {
19         System.out.println("Mid的静态的初始化代码");
20     }
21     {
22         System.out.println("Mid的初始化代码");}
23     public Mid(){
24          System.out.println("mid 的无参构造方法");}
25     public Mid(String msg){
26             this();
27            System.out.println("mid的有参的构造方法,其值为"+msg);
28     }
29 }
30 class Leaf extends Mid{
31       static{
32           System.out.println("Leaf,静态初始化块");
33       }
34       {
35           System.out.println("leaf普通初始化块");
36       }
37       public Leaf(){
38
39           super("非常疯狂java讲义");
40           System.out.println("执行leaf 的构造器");
41       }
42 }
43 public class StaticCode {
44
45     public static void main(String[] args) {
46             new Leaf();
47             System.out.println("----------------------------------");
48             new Leaf();
49
50     }
51
52 }

运行结果:
Root的静态初始化
Mid的静态的初始化代码
Leaf,静态初始化块
Root普通初始化代码
root 无参数构造方法
Mid的初始化代码
mid 的无参构造方法
mid的有参的构造方法,其值为非常疯狂java讲义
leaf普通初始化块
执行leaf 的构造器
----------------------------------
Root普通初始化代码
root 无参数构造方法
Mid的初始化代码
mid 的无参构造方法
mid的有参的构造方法,其值为非常疯狂java讲义
leaf普通初始化块
执行leaf 的构造器

解析:非静态代码块:

①创建对象时:与构造器类似,创建一个Java对象时,不仅会执行该类的初始化块和构造器,而且系统会一直上溯到java.lang.Object 类,先执行java.lang.Object类的初始化块,开始执行java.lang.Objectde 构造器,依此向下执行其父类的初始化块,开始执行其父类的构造器,,,,最后才执行该类的初始化块和构造器。

静态初始化块与类相似,系统将在初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块总是比普通初始化块先执行。

②与普通初始化块类似:系统在类初始化阶段执行静态代码块时,不仅会执行该类的静态初始化块,而且系统会一直上溯到java.lang.Object 类,先执行java.lang.Object类的静态初始化块,依此向下执行其父类的静态初始化块,,,最后在执行该类静态代码块,经过这个过程才完成了该类的初始化过程。

上面的测试代码中:创建了两个对象:创建第一个对象时:系统中没有Leaf 对象,所以要初始化i化leaf类,第二次时:由于第一次生成的Leaf在虚拟机中保存着,因此不需要再对Leaf进行初始化。

---------------------------摘自李刚《疯狂java讲义》

时间: 2024-11-02 22:12:57

初始化代码块和构造器的执行顺序的相关文章

静态代码块和构造器的执行顺序

这段时间在学习ContentProvider,还是不太明白ContentProvider中数据库是什么时候创建的.经过自己测试,实际上是用户真正插入数据的时候生成的数据库.具体代码见下一篇关于ContentProvider中的数据生成时机的随笔. 现在就说下静态代码块和构造器的执行顺序.实例化一个类A的时候(这里用的是new的方式进行实例化),如果A中有static{},即静态代码块,那么肯定先执行代码块里的代码.然后执行非静态代码块,最后才真正执行构造器里的代码. 实例化一个类A的时候的执行顺

静态 非静态代码块和构造器的执行顺序测试方法

public class Test { static{ System.out.println("静态区"); } { System.out.println("非静态!"); } private int i; public Test(int i) { super(); this.i = i; } public Test() { System.out.println("构造器!!"); } public static void main(String

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

java新建对象的static块与构造器的执行顺序

前言:本文解决的问题 新建一个对象静态代码块什么时候执行 {}里面的代码什么时候执行 有继承关系时的执行顺序 1.问题出现的背景: 构造器是用来实例化一个对象,当我们使用new关键字来新建对象时,构造器就会被调用.如果class中含有静态代码块(static)和普通代码块(在{}括号下),新建对象时的调用顺序是:静态代码块>{里面的代码}>构造器. 2.例子说明: 2.1代码说明 //父类 public class StaticExample{ { System.out.println(&qu

静态代码块、非静态代码块、构造方法的执行顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造方法).     静态代码块只在第一次new执行一次,之后不在执行,而非静态

【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("执行Person静态代码块"); } { System.out.println("执行Person构造代码块"); } public Person(){ System.out.println("执行Person构

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu

父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序

1 package demo; 2 //父类 3 public class FatherClass { 4 5 private static String strFather="父类静态属性----1"; 6 7 static{ 8 System.out.println("父类静态代码块----1"); 9 } 10 11 { 12 System.out.println("父类构造代码块----3"); 13 } 14 15 public Fat

静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序

Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 }  相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数). 1 public class Test_Static_Class { 2 //静态