为什么实例初始化块不会导致重复输入的编译时错误?

时间:2018-06-12 12:18:47

标签: java

从我的理解来看,像静态块一样用于初始化静态变量,通常实例初始化块用于初始化实例变量。 if tats the case为什么在我的代码中它不会抛出 “复制字段k”的编译时错误

    package inheritance;

public class Testanon {
    Anony a;
    int k=10;
     {
        Anony a = new Anony(){};
        int k=9;//duplicate field k
    }

    public Testanon() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
Anony a = new Anony(){};
    Testanon test = new Testanon();
System.out.println(test.k);
System.out.println(a.name);
    }
void met() {
    Anony a = new Anony(){};
}
}

输出为:9

2 个答案:

答案 0 :(得分:2)

在实例初始化程序块中声明的ak变量是局部变量,而不是实例变量。它们只是隐藏了同名的实例变量。

如果你写了

Anony a;
int k;
{
    a = new Anony(){};
    k=9;
}

您正在初始化实例初始化程序块中的实例变量。

他们被称为"实例初始化程序块"而不是"实例声明块"。您可以使用它们初始化已声明的实例变量,而不是声明新的实例变量。

另一种看待它的方法是将实例初始化程序块的代码复制到构造函数中,因为它等同于创建实例时发生的情况:

Anony a;
int k;
public Testanon() {
    Anony a = new Anony(){};
    int k = 9;
    // other code that appears in the constructor body
}

同样,您可以看到ak是局部变量,隐藏了同名的实例变量。

答案 1 :(得分:0)

它被称为instance initializer block而不是instance declaration block。因此,任何声明都会有本地的,只在给定的块内使用。

尝试打印k的值,结果会得到0因为它为给定的代码块创建了一个局部变量。 再次在块中尝试使用this.k = 9;,您将获得更新的值。