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
答案 0 :(得分:2)
在实例初始化程序块中声明的a
和k
变量是局部变量,而不是实例变量。它们只是隐藏了同名的实例变量。
如果你写了
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
}
同样,您可以看到a
和k
是局部变量,隐藏了同名的实例变量。
答案 1 :(得分:0)
它被称为instance initializer block
而不是instance declaration block
。因此,任何声明都会有本地的,只在给定的块内使用。
尝试打印k的值,结果会得到0
因为它为给定的代码块创建了一个局部变量。
再次在块中尝试使用this.k = 9;
,您将获得更新的值。