java - inner - ¿Cuántas versiones diferentes de ''x'' están disponibles en(*)?
protected class java (2)
Este es un ejercicio de entrenamiento para comprender el funcionamiento de las clases internas en Java. Como dice la pregunta, ¿cuántas versiones diferentes de x
están disponibles en (*)
?
class Outer {
int x;
class Inner extends Outer {
int x;
void f(int x) {
(*)
}
}
}
Me inclino a pensar que hay 3, a saber: this.x
, super.x
x
pero algunos de mis compañeros parecen pensar que hay 4.
¿Quién de nosotros está confundido? ¿Y puedes explicar?
Hay 4, a saber: x
, this.x
, super.x
y Outer.this.x
.
Considera lo siguiente:
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);
}
}
}
Este código se imprimirá
0
1
2
3
mostrando 4 valores diferentes.
Lo que pasa es lo siguiente:
- El padre de la instancia
inner
tiene una variablex
unificada. Para unint
, el valor predeterminado es 0: esto essuper.x
. - El método
f
se llama con el argumento1
: esto esx
. - La instancia
inner
se configuró comox
a 2 coninner.x = 2
: esto esthis.x
- La instancia
outer
, que esOuter.this
, estableció su valorx
en 3: esto esOuter.this.x
.
El truco aquí es que Inner
es tanto una clase interna (por lo que tiene una instancia Outer
adjunta) y una subclass (por lo tanto, tiene una instancia Outer
primaria), y esas dos instancias Outer
no son lo mismo.
Hay cuatro de ellos:
-
Outer.this.x
para la propiedad de claseOuter
-
this.x
para la propiedad de claseInner
-
super.x
para la propiedad de super claseOuter
-
x
para el argumento del método