Java和Android中,代码块、static静态代码块的执行顺序

Java和Android中,代码块、static静态代码块的执行顺序有没有什么区别呢。

Java

先来个简单的例子

Main.java:

public class Main {

    static int a = 1;

    static {
        System.out.println(a);
    }

    static {
        a = 2;
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.println(a);
    }
}

输出为

1

Hello World!

2

尝试交换static变量声明和static代码块后,编译报错”非法前向引用”。

交互两个代码块位置后输出

2

Hello World!

2

可见static修饰的,是从上向下,依次执行的。static变量和代码块优先执行

我们再来做一个更复杂的实验

public class Main {

    static int a = 1;

    static {
        System.out.println(a);
    }

    static {
        a = 2;
    }

    public static void main(String[] args) {
        System.out.println("Hello World!");
        Yo.test();
        Yo yooo = new Yo();
        yooo.test();
    }
}

public class Yo {
    static String name = "mark";

    static {
        System.out.println(name);
    }

    public Yo() {
        super();
        System.out.println("constructor");
    }

    static public void test() {
        System.out.println("hello " + name);
    }
}

输出

1

Hello World!

mark

hello mark

constructor

hello mark

Yo的执行符合上面的结论,执行了static代码块和静态方法test,构造Yo实例后,没有重复执行static代码块。

Android

public class TestApplication extends BaseApplication {
    static {
        Log.d("test", "Application 1123");
    }

    static int a = 1;

    static {
        Log.d("test", "Application " + a);
        HomeActivity.test();
    }

    static {
        a = 2;
    }

    @Override
    protected void attachBaseContext(Context base) {
        Log.d("test", "Application hello " + a);
    }
}

public class SplashActivity extends BaseActivity {

    static {
        Log.d("test", "SplashActivity static code block");
    }

    static int a = 1;

    static {
        Log.d("test", "SplashActivity " + a);
    }

    static {
        a = 2;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("test", "SplashActivity onCreate " + a);
        // 省略,会去start HomeActivity
    }
}

public class HomeActivity extends BaseActivity {

    public static final String TAG = "HomeActivity";

    static {
        Log.d("test", "HomeActivity 1123");
    }

    public static void test() {
        Log.d("test", "HomeActivity");
    }
}

输出结果为

D/test﹕ Application 1123

D/test﹕ Application 1

D/test﹕ HomeActivity 1123

D/test﹕ HomeActivity

D/test﹕ Application hello 2

D/test﹕ SplashActivity static code block

D/test﹕ SplashActivity 1

D/test﹕ SplashActivity onCreate 2

从结果上看java并没有什么区别

同样是先执行依次static,入口外其他类的static初始化在类被JVM加载(从结果来看,是在类被使用的时候才会加载)的时候执行。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 11:03:04

Java和Android中,代码块、static静态代码块的执行顺序的相关文章

java代码块,静态代码块,静态变量,构造方法执行顺序

一个类中执行顺序: 静态变量静态代码块代码块构造方法 子类和父类执行顺序: 父类静态变量父类静态代码块子类静态变量子类静态代码块父类代码块父类构造方法子类代码块子类构造方法 直接看代码,一目了然. public class Test { public static void main(String[] args) { new A(); /* 结果: * A静态变量 A静态代码块 A代码块 A构造方法 * */ new B(); /* * 结果: * A静态变量 A静态代码块 B静态变量 B静态代

Java中普通代码块,构造代码块,静态代码块区别及代码示例

//普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--"先出现先执行"public class CodeBlock01{ public static void main(String[] args){ { int x=3; System.out.println("1,普通代码块内的变量x="+x); } int x=1; System.out.println("主方法内的变量x="

关于java中普通代码块、构造代码块与静态代码块

1.普通代码块 public static void main(String[] args) { /*普通代码块: *直接定义在在方法或语句中出现”{普通代码的执行语句}“的就称为普通代码块. *普通代码块执行顺序由他们在代码中出现的次序决定--“先出现先执行” * */ { System.out.println("这里是普通代码块A"); } //new A(); { System.out.println("这里是普通代码块B"); } } 执行结果:这里是普通代

Java中普通代码块,构造代码块,静态代码块的代码示例及区分

//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 <span style="font-size:12px;">//普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--"先出现先执行" public class CodeBlock01{ public static

转载:Java中普通代码块,构造代码块,静态代码块区别及代码示例

//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1.普通代码块 1 //普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行” 2 public class CodeBlock01{ 3 public static void main(String[] args){ 4 5 { 6 int x=3; 7 Syst

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

Java中动态代码块,构造代码块,静态代码块之间的执行顺序

Java中动态代码块,构造代码块,静态代码块之间的执行顺序 /** * Java中动态代码块,构造代码块,静态代码块之间的执行顺序 * @author Administrator * */ class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("st

Java之static静态代码块

Java之static静态代码块 构造代码块 使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域 public class HelloA { /** ... */ { System.out.println("I'm A construct code block"); } } 构造函数代码块 构造函数代码块指的是构造函数中所包含的代码,类似className(){}中的代码块 public class H

浅析Java中的构造代码块、静态代码块与构造方法

构造代码块.静态代码块与构造方法是三种不同的代码块,那么他们到底有什么区别呢? 一.简单认识一下构造代码块.静态代码块与构造方法 class A { //构造代码块 { System.out.println("构造代码块A"); } //静态代码块 static { System.out.println("静态代码块A"); } //构造方法 public A() { System.out.println("构造方法A"); } } 二.弄清三者