-2

以下程序的输出是:

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

4 回答 4

2

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

当运行时加载类时调用它,这就是它可能在运行之前main运行的原因。

于 2013-10-11T08:41:00.957 回答
0

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

2:当你的构造函数被调用时,父构造函数被调用

3 : 并且无论何时加载一个类,即使对于构造函数,静态块都会首先执行,

因此你得到你得到的订单

因为你正在执行你的类,所以首先检查完整的文件是否有任何静态块,甚至在调用主方法之前执行静态块。

于 2013-10-11T08:41:35.733 回答
0

请解释一下类中 static { // some lines } 的含义。

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


为什么“inmain”在 main() 中排在第三位?

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

因此,输出。

于 2013-10-11T08:42:34.810 回答
0

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

于 2013-10-11T08:42:44.740 回答