静态代码块、静态变量等执行顺序

 1 public class BasicTest {
 2     public static void main(String[] args) {
 3         System.out.println("m1:");
 4         Mimi m1=new Mimi();
 5         System.out.println("m2:");
 6         Mimi m2=new Mimi();
 7     }
 8 }
 9
10 class Mimi {
11     public static int si=0;
12     int di=si;
13     static{
14         //首先执行
15         si++;
16         System.out.println("static block1: si="+si);
17     }
18
19     {
20         //si*=2;
21         System.out.println("block2: si="+si+", di="+di);
22     }
23
24     static{
25         //首先执行
26         si++;
27         System.out.println("static block2: si="+si);
28     }
29
30     public Mimi() {
31         di=10;
32         System.out.println("constructor: si="+si+", di="+di);
33         si=500;
34     }
35 }

执行顺序是:

静态成员变量初始化

静态代码块调用

动态成员变量初始化

非静态代码块调用

构造方法调用

以下供练习:

 1 public class TestPerson {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         Person person = new Person();
 6         Person person2 = new Person();
 7     }
 8
 9 }
10
11 class Person {
12     public final String name;
13     public int age;
14
15     public Person() {
16         System.out.println("无参构造方法");
17     }
18
19     {
20         System.out.println("代码块2");
21     }
22
23     {
24         System.out.println("代码块1");
25         name = "小明";
26     }
27
28     static {
29         System.out.println("静态代码块2");
30     }
31
32     static {
33         System.out.println("静态代码块1");
34     }
35
36
37
38     public Person(int age) {
39         this.age = age;
40         //this.name = "";
41         System.out.println("构造age方法");
42     }
43
44     public void goToSchool() {
45         System.out.println(name + "goToSchool方法");
46     }
47 }

结果:

静态代码块2
静态代码块1
代码块2
代码块1
无参构造方法
代码块2
代码块1
无参构造方法

原文地址:https://www.cnblogs.com/zhuziyu/p/8591833.html

时间: 2024-10-10 08:01:11

静态代码块、静态变量等执行顺序的相关文章

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

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

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

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

JAVA静态代码块的作用及执行顺序

一般情况下,如果有些代码必须在项目启动的时候就执行,需要使用静态代码块.这种代码是主动执行的,需要在项目启动的时候就初始化. 有些代码是在不创建对象的情况下,由其他程序来调用,需要使用静态方法.这种代码是被动执行的. 静态方法在类加载的时候就已经加载,可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的,而静态方法是被调用的时候才执行的. 区别很简单:静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次:非静态代码块,在创建对象的时候(

静态代码块(主要是注意执行顺序)

静态代码块在类最初被使用的时候执行一次,在构造函数执行之前执行,而且只执行一次. 只要用到类,哪怕没有new只是声明变量也会被执行但是只执行一次. (静态字段和静态代码块都是在类最初使用的时候执行一次) 1 public class MyJingTaiDaimaKuai 2 { 3 public static int i = test1();//1.最开始执行 4 public int age = test2();//new的时候先执行成员变量的初始化,再执行构造函数 5 6 static My

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

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

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

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的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

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