method inner java inner-classes

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:

  1. El padre de la instancia inner tiene una variable x unificada. Para un int , el valor predeterminado es 0: esto es super.x .
  2. El método f se llama con el argumento 1 : esto es x .
  3. La instancia inner se configuró como x a 2 con inner.x = 2 : esto es this.x
  4. La instancia outer , que es Outer.this , estableció su valor x en 3: esto es Outer.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 clase Outer
  • this.x para la propiedad de clase Inner
  • super.x para la propiedad de super clase Outer
  • x para el argumento del método