Problema con referencia ilegal hacia adelante en Java

Dmitry:

¿Por qué cuando utilizo referencia thisen una declaración de variables, no aparece referencia ilegal hacia adelante? ¿Cuál es la diferencia entre la declaración con thisy sin ella?

El siguiente ejemplo falla al compilar debido a la referencia ilegal hacia adelante:

class FailsToCompile {
    int a = b; //illegal forward reference
    int b = 10;
}

Al calificar el uso de bpor thisel error de compilación desaparece.

class Compiles {
    int a = this.b; //that's ok
    int b = 10;
}
AxelH:

Suponiendo que la siguiente clase de

public class MyClass {
    int a = b;
    int b = 10;
}

El JLS 8.3.3. establece en su caso:

El uso de variables de instancia cuyas declaraciones aparecerá textualmente después del uso se restringe a veces
- El uso es un nombre simple en ya sea una variable de instancia inicializador de C o una instancia inicializador de C

Ahora, utilizando el miembro thisle permite acceder a una instancia que ya se declaró con valores por defecto ( a = 0, b = 0), pero aún no inicializado completamente. Esto es visible si se comprueba el resultado de:

public class MyClass {
    int a = this.b;
    int b = 10;
}

No se puede obtener el valor esperado:

new MyClass().a //0
new MyClass().b //10

No puedo explicar por qué esto es legal exactamente ya que este nunca se daría un valor correcto. Podemos encontrar alguna explicación acerca de por qué existe la restricción:

Las restricciones anteriormente están diseñados para la captura, en tiempo de compilación, inicializaciones circulares o malformadas lo contrario.

Pero ¿por qué permitir thisa las obras ...


Sabiendo que durante una inicialización de una instancia, las acciones siguientes:

  1. declaración de miembro
  2. ejecución del bloque y la inicialización de campo con el fin
  3. constructor de ejecución

Dar un comportamiento extraño:

public class MyClass {

    {
        b = 10;
    }
    int a = this.b;
    int b = 5;
    {
        b = 15;
    }

    public static void main(String[] args) {
        MyClass m = new MyClass();
        System.out.println(m.a); //10
        System.out.println(m.b); //15
    }
}

Me limitar la inicialización en el constructor.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=173551&siteId=1
Recomendado
Clasificación