我无法理解为什么'y'在'c'之前打印出来......我在这里遗漏了什么...... 请帮助
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
答案 0 :(得分:1)
输出
x y c g
在java中,执行顺序如下。
x
y
c
然后您调用了打印go()
的方法g
。
假设Sequence继承自SuperSequence。
public class SuperSequence() {
static {
System.out.print("staic of super ");
}
public SuperSequnce() {
System.out.print("constructor of super ");
}
}
输出
static of super x constructor of super y c g
因为首先执行超类的静态块。然后是Sequence
类的静态块。
答案 1 :(得分:1)
以下说明应有所帮助:(按顺序执行)
static {}
:加载类时执行此块。这称为静态初始化块。 {}
:每次创建类的新实例时都会执行此块。这称为实例初始化块。Sequence()
:在上面的块之后,构造函数在新实例创建时执行。答案 2 :(得分:0)
在java静态块中总是首先执行,然后是初始化块,它被写为
{
//...your code to initialize any variable
}
剩余的两个块,如构造函数Sequence()
和void go();
方法将相应执行
根据关于初始化块的java的官方文档是:
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
答案 3 :(得分:0)
我改变了问题的源代码,在超类中添加了一个超类和一个静态块。下面的代码打印:
测试静态x zy c g
代码:
class test{
static{
System.out.print("test static ");
}
public test(){
System.out.print("z");
}
}
class Sequence extends test {
Sequence(){
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go(){
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
因此它与Luiggi Mendoza所说的完全相同: