在 (*) 中可以访问多少个不同版本的 'x'?
How many different versions of 'x' are accessible in (*)?
这是了解 Java 内部 类 工作原理的训练练习。如问题所述,在 (*)
中可以访问多少个不同版本的 x
?
class Outer {
int x;
class Inner extends Outer {
int x;
void f(int x) {
(*)
}
}
}
我倾向于认为有 3 个,即:this.x
、super.x
和 x
但我的一些同行似乎认为有 4 个。
我们谁迷茫了?你能解释一下吗?
有四个:
Outer.this.x
为 Outer
class 属性
this.x
为 Inner
class 属性
super.x
对于超类型 Outer
class 属性
x
方法参数
有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
。
- 使用参数
1
调用方法 f
:这是 x
。
- 实例
inner
已将其 x
设置为 2 inner.x = 2
:这是 this.x
。
outer
实例,即 Outer.this
已将其 x
值设置为 3:这是 Outer.this.x
。
这里的技巧是 Inner
都是一个 inner class (so it has an enclosing Outer
instance) and a subclass (所以它有一个父 Outer
实例),而这两个 Outer
实例是不一样的.
这是了解 Java 内部 类 工作原理的训练练习。如问题所述,在 (*)
中可以访问多少个不同版本的 x
?
class Outer {
int x;
class Inner extends Outer {
int x;
void f(int x) {
(*)
}
}
}
我倾向于认为有 3 个,即:this.x
、super.x
和 x
但我的一些同行似乎认为有 4 个。
我们谁迷茫了?你能解释一下吗?
有四个:
Outer.this.x
为Outer
class 属性this.x
为Inner
class 属性super.x
对于超类型Outer
class 属性x
方法参数
有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
。- 使用参数
1
调用方法f
:这是x
。 - 实例
inner
已将其x
设置为 2inner.x = 2
:这是this.x
。 outer
实例,即Outer.this
已将其x
值设置为 3:这是Outer.this.x
。
这里的技巧是 Inner
都是一个 inner class (so it has an enclosing Outer
instance) and a subclass (所以它有一个父 Outer
实例),而这两个 Outer
实例是不一样的.