1

这是演示静态块和静态方法的源代码。

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 )吗?什么时候初始化/增量实际发生在程序中?谢谢!

4

6 回答 6

4

增量发生在构造函数中。在显示计数器之前调用构造函数两次,因此它增加了两次。如果您将 display() 放在两个构造函数调用之间,您将看到11 12您所期望的。

顺便说一句,您可以通过单步调试调试器中的代码来查看所有这些。

于 2013-04-24T11:19:47.277 回答
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

本质上,您要增加两次,然后输出两次 - 因此是结果。

于 2013-04-24T11:21:16.953 回答
2

看看你的构造函数 -

StaticDemo(){
    count++;
}

每次创建对象时都会增加静态变量。您在这里创建了两个对象,因此它将增加 2。这就解释了为什么你两次得到 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
}

我希望这可以为您清除实际输出。

于 2013-04-24T11:19:29.140 回答
1
 public static void main(String args[]){
     StaticDemo t1=new StaticDemo();
     StaticDemo.display();
     StaticDemo t2=new StaticDemo();
     t2.display();

  }

输出:

静态块写在 Main 之前 静态块写在 Main 之后 11 12

编辑:// 问题是你调用了 display(),在你调用了构造函数 2 次之后。因为 display() 使用与每次 12 相同的值

edit2:// 到迟到

于 2013-04-24T11:20:40.157 回答
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

于 2013-04-24T11:22:58.277 回答
0

@用户2315188 ..

您正在创建 t1 和 t2 对象,因此无参数构造函数调用 2 次,第一次计数值为 11,第二次计数变为 12,因此您得到输出 12,12

     StaticDemo t1=new StaticDemo();
     StaticDemo t2=new StaticDemo();
于 2013-04-24T11:28:39.340 回答