我对java中的静态几乎没有疑问
我们可以在非静态类中有静态块吗?如果那个(非静态)类的对象在其他类中初始化,那么静态块会被执行吗?
如果有一个具有静态块和变量(int a = 3)和main()方法的静态类,并且它被执行,那么变量初始化会首先发生还是静态块执行?我知道静态块在main之前执行() 方法。
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
请看这里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® 语言规范中的详细初始化过程。只是静态块按照它们在源代码中出现的顺序执行。
是的,我们可以在一个类中有一个静态块,non-static
它会在类加载到 JVM 时立即加载
public class StaticDemo {
static{
System.out.println("already loaded");
}
public static void main(String [] args){
}
}
这输出already loaded
对于问题 2,可以在Java 语言规范 §12.4.2中找到答案,特别是“详细初始化过程”的第 9 步:
接下来,按文本顺序执行 [...] 类 [...] 的类变量初始化程序和静态初始化程序,就好像它们是单个块一样。
换句话说,static {}
静态字段的块和初始化表达式按照它们在源代码中出现的顺序执行 - 如果静态块在字段声明之前,那么它将首先运行(并查看字段的默认值,通常null
或 0),如果静态块在字段声明之后,那么它将运行第二个(并将看到初始化表达式分配的值)。
拥有静态类与普通类不会影响您可以使用的编程结构,而只是控制该类是否可以访问周围类的实例字段/方法。