descargar - ¿Qué se llama una referencia hacia adelante en Java?
java offline (4)
En términos simples, significa referenciar (acceder a una variable, llamar a una función) que está más abajo en el archivo de código.
static int x=getY();
static int y=5;
static int getY() { return y; }
- El valor de x se establece en el resultado de getY ()
- getY () se llama antes de que el valor de y se establezca en 5
- El valor de x es por lo tanto 0 (entero por defecto)
- el valor de y es 5
He analizado esta cuestión sobre la legalidad de las referencias futuras, pero no tengo claro qué se entiende por forward references
en el lenguaje Java. ¿Puede alguien explicar con la ayuda de un ejemplo?
Es básicamente el orden en que el compilador lee las cosas, si tiene
int c = 3
int a = b;
int b = 5;
el compilador lo leerá de arriba a abajo, por lo que verá la primera línea, que declara una variable ''c'', y la asigna a 3, y eso está bien, luego se encontrará con la segunda línea, que declara una variable '' a '', y luego trata de asignarlo a'' b ''.
Pero ahora, el compilador tiene un problema: ¿qué es esta cosa ''b''? Solo ha aprendido sobre ''c'', y recientemente ''a'', pero no tiene conocimiento de nada llamado ''b'', ya que para el compilador todavía no se ha declarado. Entonces, dado que el compilador no puede manejar toda la confusión, se detiene y te deja ver lo que has hecho para enojarlo.
Entonces, la parte de referencia hacia adelante sería una referencia a algo que aún no existe. Adelante en el tiempo tal vez ..
Esto es específicamente un error de compilación. Y todo sobre el orden de las declaraciones de variables de clase. Vamos a utilizar algunos códigos con fines ilustrativos:
public class ForwardReference {
public ForwardReference() {
super();
}
public ForwardReference echoReference() {
return this;
}
public void testLegalForwardReference() {
// Illustration: Legal
this.x = 5;
}
private int x = 0;
// Illustration: Illegal
private ForwardReference b = a.reference();
private ForwardReference a = new ForwardReference();
}
Como puede ver, Java le permite hacer referencia a una variable de clase en un método de clase , incluso si la declaración de la variable viene después del método. Este es un ejemplo de una referencia hacia adelante (legal), y el soporte para esto está integrado en el compilador de Java.
Sin embargo, lo que no puede hacer es declarar una variable de clase ''a'' que depende de otra variable de clase ''b'' que aún no se ha declarado. Las declaraciones de variables de clase dependientes deben aparecer en orden inverso a su dependencia.
En una tangente, la mayoría, si no todos los IDE, le avisarán si su código contiene errores de referencia ilegales.
Las referencias directas ilegales se tratan en la sección 8.3.2.3 del JLS.
public class AnyCode {
void print() {
System.out.println("Value of j - " + j); // legal
System.out.println("Value of i - " + i); // legal
}
// CASE - 1
int k = i; // illegal
int i;
// CASE - 2
int l = j; // legal
static int m = j; // illegal
static int j;
// CASE - 3
A aObj = bObj; // illegal
B bObj = new B();
public static void main(String[] args) {
/*
Note :- here anyCode act as a local variable and get space on stack
whereas the object it is referring to is present on heap. And you
cannot forward reference a local variable.
*/
anyCode.print(); // ''Cannot find symbol'' error
AnyCode anyCode = new AnyCode();
}
}
class A {
}
class B {
}
********* Consulte el caso - 1 *********
La variable de instancia de referencia hacia adelante no está permitida ya que el compilador no está seguro del tipo de valor al que estamos haciendo referencia hacia adelante o incluso podría ser posible que no exista tal variable.
Considere un ejemplo:
int a = b;
boolean b = false;
Si se permite la referencia hacia adelante en el caso anterior, podría crear un caos.
int a = b; // What is b? is it a primitive variable or a value or a object reference
en el ejemplo anterior he decidido no declarar b y ahora si java permitía tal asignación, entonces sería una pesadilla.
********** Consulte el caso - 2 *********
Las variables estáticas se cargan antes que las variables de instancia y, por lo tanto, hacer referencia a las variables estáticas y asignarlas a la variable de instancia es perfectamente correcto