程序的输出如何来?

时间:2013-10-11 08:37:21

标签: java

以下程序的输出是:

superstatic block
static blockn0  
inmain  
super constructor  
constructor

以下是代码:

 class StaticSuper{
    static {
           System.out.println("superstatic block");
    }
    StaticSuper(){
           System.out.println("super constructor");
    }
 }

 public class StaticClassExample extends StaticSuper{
      static int rand;

      static {
           rand =(int) (Math.random() * 6);
           System.out.println("static blockn" + rand);
      }
      StaticClassExample(){
           System.out.println("constructor");
      }

      public static void main(String[] args) {
           System.out.println("inmain");
           StaticClassExample st= new StaticClassExample();
      }
 }

为什么“inmain”被打印在第三位,虽然它是main()中的第一位?请解释一下我的意思:

static {
 // some lines
}
在课堂上

4 个答案:

答案 0 :(得分:2)

您看到的static块就是我们所说的静态初始化程序,它的作用通常是初始化类中的某些内容(可能是类范围的状态或某种类型的资源)。

运行时加载类时调用,这就是为什么它可以在main运行之前运行。

答案 1 :(得分:0)

1:使用new ==>创建实例时它调用构造函数

2:就在调用构造函数时,调用父构造函数

3:并且每当加载一个类时,即使对于构造函数,也会首先执行静态块,

因此您获得了获得的订单

因为您正在执行您的类,所以首先检查完整文件是否存在任何静态块,并且甚至在调用main方法之前执行静态块

答案 2 :(得分:0)

  

请解释一下静态{// some lines}的含义   类。

它被称为static initializer。它在类加载(或初始化,确切地说)时执行。静态块将在main()方法之前执行。


  

为什么“inmain”会在main()中首先打印第三个?

由于静态块在main()之前执行,因此它在打印列表中显示为第三个,当您创建StaticClassExample类的实例时,首先调用其parent构造函数,然后调用它自己的构造函数被调用。

因此,输出。

答案 3 :(得分:0)

在加载类时调用静态块。这就是为什么首先打印静态打印输出。 静态变量意味着该类的不同实例不会有该变量的单独副本。 如果您想在类加载时执行某些操作,那么静态代码块就很简单了。