0

我的代码是:-

class Test
{
  static int a = 11;
  static
  {
    System.out.println("Hello static! " + main() + a);
  }

  public static void main(String[]args)
  {
    System.out.println("Hello String!");
  }

  public static char main()
  {
    System.out.println("Hello char!");
    return 'H';
  }
}

输出:-

Hello char!
Hello static! H11
Hello String!

为什么是“你好 char!” 在“你好静态!”之前打印?

4

5 回答 5

3
  1. 静态块首先执行。
  2. 它在组装要打印的字符串时调用不带参数的 main()。
  3. main() 打印一些输出。
  4. 静态块打印其输出。
  5. 静态块退出。
  6. 您的 main(String[]) 方法执行并打印其输出。
于 2013-02-10T08:50:55.127 回答
1

为什么是“你好 char!” 在“你好静态!”之前打印?

因为,方法在语句打印main()完成之前被调用和执行。sysoutHello static

这是执行顺序: -

  • 类已加载。
  • static变量a被加载并初始化为11.
  • static块被执行。
  • sysout那里的语句,main()调用静态方法。此时Hello static还没有打印出来,因为sysout语句不完整。
  • 执行控制转到main()方法。因为没有它,当前的 sysout 语句将无法完成。
  • main()方法打印"Hello char",然后返回'H'
  • 执行回到static块,在里面sysout
  • sysout完成执行,并打印"Hello static! H11"

注意: -sysout以上表示 - System.out.println()

于 2013-02-10T08:47:58.190 回答
1

让我们分解一下。

运行的第一件事是静态初始化程序块。所以我们运行这一行:

System.out.println("Hello static! " + main() + a);

但在调用该方法之前,我们必须调用 main(),因为我们必须首先对所有参数进行全面评估。

所以这在静态初始化程序中的 println 之前被调用:

public static char main()
{
  System.out.println("Hello char!");
  return 'H';
}

这打印了Hello char!我们在第一行看到的。

它返回 H,它被打印在旁边Hello static!

最后,调用 main(string[]) 开始程序。我们看到了Hello String!

于 2013-02-10T08:48:19.630 回答
1

这里的一般执行逻辑如下:

  1. 类被加载,因此静态构造函数被执行。
  2. 在构造函数内部,对 String (参数 to System.out.println())进行求值,它调用char main()方法。
  3. 评估该char main()方法。
  4. char main()字符串内部打印:第一个输出行
  5. 静态构造函数中的字符串已构建,因此可以打印:第二个输出行
  6. 实际void main()可以执行,打印第三行:3rd output line
于 2013-02-10T08:49:01.127 回答
1

在你的行

System.out.println("你好静态!" + main() + a);

main() 在 System.out.println 之前执行,因此 char main() 中的 print 语句将在外部打印语句“Hello Static”之前执行是有道理的。

于 2013-02-10T08:49:38.637 回答