关于java中的静态我几乎没有问题
我们可以在非静态类中使用静态块吗?如果是对象的话 那个(非静态)类在其他一些类中被初始化了 静态块得到执行然后??
如果有一个静态类有静态块和变量(int a = 3)和main()方法,然后执行它将变量 首先进行初始化还是静态块执行?我知道 静态块在main()方法之前执行。
答案 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