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
innertiene una variablexunificada. Para unint, el valor predeterminado es 0: esto essuper.x. - El método
fse llama con el argumento1: esto esx. - La instancia
innerse configuró comoxa 2 coninner.x = 2: esto esthis.x - La instancia
outer, que esOuter.this, estableció su valorxen 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.xpara la propiedad de claseOuter -
this.xpara la propiedad de claseInner -
super.xpara la propiedad de super claseOuter -
xpara el argumento del método