这是一个用于理解Java中内部类的工作的训练练习。正如问题所述,x
可以访问多少个不同版本的(*)
?
class Outer {
int x;
class Inner extends Outer {
int x;
void f(int x) {
(*)
}
}
}
我倾向于认为有3个,即this.x
,super.x
和x
,但我的一些同行似乎认为有4个。
我们哪个人感到困惑?你能解释一下吗?
答案 0 :(得分:30)
有4个,即:x
,this.x
,super.x
和Outer.this.x
。
请考虑以下事项:
public class Outer {
int x;
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
outer.x = 3;
inner.x = 2;
inner.f(1);
}
class Inner extends Outer {
int x;
void f(int x) {
System.out.println(super.x);
System.out.println(x);
System.out.println(this.x);
System.out.println(Outer.this.x);
}
}
}
此代码将打印
0
1
2
3
显示4个不同的值。
发生的事情如下:
inner
实例的父级具有一个联合x
变量。对于int
,默认值为0:这是super.x
。f
调用方法1
:这是x
。inner
已将x
设置为2 inner.x = 2
:这是this.x
。outer
实例Outer.this
已将x
值设置为3:这是Outer.this.x
。这里的诀窍是Inner
既是inner class(所以它有一个封闭的Outer
实例)和subclass(所以它有一个父Outer
这两个Outer
个实例并不相同。
答案 1 :(得分:11)
其中有四个:
Outer.this.x
代表Outer
类属性
{li> this.x
代表Inner
类属性
super.x
表示超类型Outer
类属性x
用于方法参数