【问题标题】:Why instance initialization block is not throwing compile time error for duplicate entry?为什么实例初始化块不会为重复条目引发编译时错误?
【发布时间】:2018-06-12 12:18:46
【问题描述】:

据我了解,像静态块用于初始化静态变量,通常实例初始化块用于初始化实例变量。 如果符合这种情况,为什么在我的代码中它没有为 "duplicate field 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

【问题讨论】:

    标签: java


    【解决方案1】:

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

    如果你写了

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

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

    它们被称为“实例 initializer 块”而不是“实例 声明 块”是有原因的。您可以使用它们来初始化已声明的实例变量,而不是声明新的实例变量。

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

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

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

    【讨论】:

    • 我的问题是为什么它允许 declarations 如果它只是 initializer ?我想它也没有隐藏,如果我初始化 int k=10 它需要实际的初始化值(10),而不是由 'IIB' 初始化的值
    • @amarnathharish 您可以在任何{} 块内声明局部变量。不管是静态初始化块、实例初始化块、构造函数、方法还是某个方法中的内部块。
    • @amarnathharish 这不是真的。如果在实例初始化块中写入int k=9;,实例变量k 将保持不变(默认为0)。
    • 我的意思是直接在外部 IIB初始化
    • @amarnathharish 事实上,IIB 中的int k=9; 不会影响实例变量k,这意味着IIB 的本地k 隐藏了实例变量k
    【解决方案2】:

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

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

    【讨论】:

    • 它可以工作,但是由于我们还没有完成构造函数调用,如何使用this
    • 实例初始化块在构造函数调用之前和 super() 之后执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2018-07-16
    • 2014-04-20
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多