Java:静态方法和静态块输出

时间:2013-04-24 11:15:57

标签: java

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

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

6 个答案:

答案 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();