我知道有很多类似的问题,但我希望得到一些关于这个问题的详细解释。
假设我有这段代码 -
public class Finalexamples {
public int num = 3;
public static int num2;
public static Finalexamples a;
public Finalexamples(){
Finalexamples.num2 = 4;
}
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
public static void main(String[] args) {
System.out.println("Starting...");
}
}
答案 0 :(得分:3)
为什么0
?它应该输出4
而不是。
加载类时,将按照幻影的顺序读取和执行静态字段和语句。
首先执行这些:
public static int num2;
public static Finalexamples a;
然后调用它:
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
这:a = new Finalexamples();
执行:Finalexamples.num2 = 4;
因此System.out.println(num2);
会显示4
答案 1 :(得分:0)
好的,首先Java转到类中最顶层的静态声明(定义{{1}}作为int),然后将num2
定义为a
对象。然后它转到你的静态块。在静态块中,它会看到Finalexamples
,然后通过构造函数创建a = new Finalexamples();
。 (如果在静态初始化结束之前没有执行此步骤,a
将无法访问,直到结束,因为它没有构造,这不好!)所以在我们的构造函数中变量a
我们设置a
等于4.构造函数完成后,Java返回执行静态块,并打印出Finalexamples.num2
,现在为4。
答案 2 :(得分:0)
首先了解此流程(仅适用于您的程序),
静态变量的初始化。
public static int num2;
public static Finalexamples a;
执行静态块:
static{
a = new Finalexamples();
System.out.println(num2);
Finalexamples.num2 = 5;
}
在初始化对象引用时,' a'在静态块中Finalexamples
,将调用Finalexamples类的构造函数。
public Finalexamples(){
Finalexamples.num2 = 4;
}
Finalexamples.main()方法。什么都没有。
public static void main(String[] args) {
System.out.println("Starting...");
}
回答你的问题。
一个。静态变量在执行开始时仅初始化一次。这些变量将在任何实例变量初始化之前首先初始化。它是属于类的变量而不是对象(实例)。要由类
的所有实例共享的单个副本 B中。它不是'0'
因为您正在使用Finalexamples的新对象初始化静态块中的对象引用。此时将调用构造函数,并将num2
的vaule设置为4
。
我希望这有帮助!
答案 3 :(得分:0)
你最后的输出是5 在java中,你的两个部分首先是Class Area,第二部分是Heap区域 类区块包含三个块 方法区域,静态区域,常量pool.static块在类加载时运行所以你的静态变量是在静态块中创建的,它是在静态块的运行时初始化的,而静态变量不会在java中创建多个副本,所以你可以测试像这样的代码
public class HelloWorld{
public int num = 3;
public static int num2;
public static HelloWorld a;
public HelloWorld(){
System.out.println("Constructor Creation value of num2 "+num2);
HelloWorld.num2 = 4;
System.out.println("Variable Initialization in Constructor value of num2 "+num2);
}
static{
System.out.println("Static bloack execution value of num2 "+num2);
a = new HelloWorld();
HelloWorld.num2 = 5;
System.out.println("Variable Initialization in Static bloack value of num2 "+num2);
}
public static void main(String[] args) {
System.out.println("Starting...");
}}