我们可以在java中的非静态类中使用静态块吗?

时间:2013-07-10 06:29:38

标签: java static

关于java中的静态我几乎没有问题

  1. 我们可以在非静态类中使用静态块吗?如果是对象的话 那个(非静态)类在其他一些类中被初始化了 静态块得到执行然后??

  2. 如果有一个静态类有静态块和变量(int a = 3)和main()方法,然后执行它将变量 首先进行初始化还是静态块执行?我知道 静态块在main()方法之前执行。

5 个答案:

答案 0 :(得分:4)

1)不,你不能,试试这个

class Test1 {

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

X应该是静态的。

注意:我假设我们讨论的是嵌套类,因为这是静态修饰符适用于类的地方

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

静态初始化仅在类加载期间运行,它始终在任何实例实例化之前发生。有趣的是,静态字段初始化和静态初始化块代码都在名称为<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

答案 1 :(得分:3)

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

它被称为static initializer in the spec。当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();
    }
}

有关致电订单的详情,请参阅Detailed Initialization Procedure中的The Java® Language Specification。只需按照它们在源代码中出现的顺序执行静态块。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

对于问题2,答案可以在Java Language Specification §12.4.2中找到,特别是“详细初始化程序”的第9步:

  

接下来,按文本顺序执行类[...]的类变量初始值设定项和静态初始值设定项,就像它们是单个块一样。

换句话说,static {}块和静态字段的初始化表达式按照它们在源代码中出现的顺序执行 - 如果静态块在字段声明之前,那么它将首先运行(并参见字段的默认值,通常为null或0),如果静态块在字段声明之后,则它将运行第二个(并且将看到初始化表达式指定的值)。

答案 4 :(得分:0)

是的,我们可以在non-static类中有一个静态块,并在JVM中加载类时立即加载

public class StaticDemo {

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

    public static void main(String [] args){

    }

}

这会输出already loaded