繁体   English   中英

我们可以在Java的非静态类中具有静态块吗?

[英]can we have static block in non static class in java?

我对Java的静态问题很少

  1. 我们可以在非静态类中使用静态块吗?如果该(非静态)类的对象在其他某个类中初始化,那么将执行静态块吗?

  2. 如果有一个包含静态块和变量的静态类(int a = 3)和main()方法被执行,那么变量初始化将首先发生还是静态块执行?我知道静态块在main之前执行() 方法。

1)不,您不能尝试

class Test1 {

    class X {
        static {  <-- compile error: Cannot define static initializer in inner type Test1.X
        }
    }
...

X应该是静态的。

注意:我假设我们正在谈论嵌套类,因为这是static修饰符适用于类的地方

2)视情况而定

class Test1 {
    static {
        x = 3;
    }

    static int x = 2;

    public static void main(String[] args) throws Exception {
        System.out.println(x);
    }
 }

输出

2

但现在

class Test1 {
    static int x = 2;

    static {
        x = 3;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(x);
    }
}

输出将是

3

静态初始化仅在类加载期间运行一次,它总是在实例实例化之前进行。 有趣的是,静态字段初始化和静态init块代码都在名称为<clinit>的相同字节码函数中<clinit>

  static <clinit>()V
   L0
    LINENUMBER 12 L0
    ICONST_3
    PUTSTATIC test/Test1.x : I
   L1
    LINENUMBER 15 L1
    ICONST_2
    PUTSTATIC test/Test1.x : I
    RETURN

请在这里查看http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

在规范中称为静态初始化器 JVM加载该类时,将执行此代码。 运行时系统保证静态初始化块按在源代码中出现的顺序被调用。

您不能在非静态内部类中使用静态代码

    public class MyClass {

    static {
        System.out.println("static code from nonstatic class");
    }

    class In {
        /* it will not compile
        static {

        }
        */
    }
    static class In2 {
        static {
         System.out.println("static code from static inner class");
        }
    }
    public static void main(String[] args) {
        MyClass c = new MyClass();
    }
}

有关调用顺序的详细信息,请参见Java®语言规范 详细初始化过程 只需按照它们在源代码中出现的顺序执行静态块。

拥有静态类与普通类不会影响您允许使用的编程构造,而只是控制该类是否可以访问周围类的实例字段/方法。

对于问题2,可以在Java语言规范§12.4.2中找到答案,尤其是“详细初始化过程”的步骤9:

接下来,按照文本顺序执行类的类变量初始化器和静态初始化器,就好像它们是单个块一样。

换句话说, static {}块和静态字段的初始化程序表达式将按照它们在源代码中出现的顺序执行-如果静态块在字段声明之前,则它将首先运行(并查看默认值字段,通常为null或0),如果该静态块位于字段声明之后,则它将第二次运行(并将看到由初始化程序表达式分配的值)。

是的,我们可以在non-static类中包含一个静态块,并且在JVM中将类加载后立即将其加载

public class StaticDemo {

    static{
        System.out.println("already loaded");
    }

    public static void main(String [] args){

    }

}

此输出already loaded

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM