这是演示静态块和静态方法的源代码。
class StaticDemo
{
static int count=10;
StaticDemo(){
count++;
}
static void display(){
System.out.println(count);
}
static{
System.out.println("Static Block written Before Main");
}
public static void main(String args[]){
StaticDemo t1=new StaticDemo();
StaticDemo t2=new StaticDemo();
StaticDemo.display();
t2.display();
}
static{
System.out.println("Static Block written After Main");
}
}
我希望输出
Static Block written Before Main
Static Block written After Main
11
12
然后我得到
的输出Static Block written Before Main
Static Block written After Main
12
12
我知道静态块是要执行的第一组代码,因此是前两个语句的顺序。但是,当JVM创建StaticDemo类的对象t1时,count的值是否增加到11(10 + 1)?初始化/增量何时在程序中实际发生? 谢谢!
答案 0 :(得分:4)
增量发生在构造函数中。在显示计数器之前调用构造函数两次,使其递增两次。如果将display()放在两个构造函数调用之间,您将看到11 12
正如您所期望的那样。
BTW您可以通过逐步调试调试器中的代码来查看所有这些内容。
答案 1 :(得分:3)
输出由main
方法中的语句顺序解释:
StaticDemo t1=new StaticDemo(); //this increments count to 11
StaticDemo t2=new StaticDemo(); //this increments count to 12
StaticDemo.display(); //this outputs 12
t2.display(); //this outputs 12
基本上,你增加两次,然后输出两次 - 结果。
答案 2 :(得分:2)
看看你的构造函数 -
StaticDemo(){
count++;
}
每次创建对象时,都在递增静态变量。你在这里创建了两个对象,所以它会增加两个。这就解释了为什么你两次得到12次。
获得“预期”输出 -
public static void main(String args[]){
StaticDemo t1=new StaticDemo(); // count got incremented, now contains 11
StaticDemo.display(); // will print 11
StaticDemo t2=new StaticDemo(); // again count got incremented
t2.display(); // will print 12
}
我希望这能为你清除实际输出。
答案 3 :(得分:1)
public static void main(String args[]){
StaticDemo t1=new StaticDemo();
StaticDemo.display();
StaticDemo t2=new StaticDemo();
t2.display();
}
输出:
在Main之前写的静态块 主要后写的静态块 11 12
编辑:// 问题是你在调用constructer 2次之后调用display()。因为display()使用每次12得到的相同值
edit2:// to late sry
答案 4 :(得分:0)
见下文:
public static void main(String args[]){
//Initially value of count is 10
StaticDemo t1=new StaticDemo(); //here it becomes 11
StaticDemo t2=new StaticDemo(); //here it becomes 12
StaticDemo.display(); //Now you are printing, it will print 12
t2.display(); //The value has not changed, so again 12
}
如果您将块重写为:
public static void main(String args[]){
StaticDemo t1=new StaticDemo();
StaticDemo.display();
StaticDemo t2=new StaticDemo();
t2.display();
}
然后你应该看到输出为11,12
答案 5 :(得分:0)
@ user2315188 ..
你正在创建t1和t2对象,所以无参数构造函数调用2次,第一次计数值为11,第二次计数变为12,所以你得到输出12,12
StaticDemo t1=new StaticDemo();
StaticDemo t2=new StaticDemo();