Я прошел через этот вопрос о законности прямых ссылок, но неясно, что означает forward references
в языке Java. Может кто-нибудь объяснить с помощью примера?
Что называется прямой ссылкой в Java?
Ответ 1
Это ошибка компиляции. И все это о упорядочении объявлений переменных класса. Позвольте использовать некоторый код для иллюстративных целей:
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();
}
Как вы можете видеть, Java позволяет ссылаться на переменную класса в методе класса, даже если объявление переменной имеет значение после метод. Это пример (юридической) прямой ссылки, и поддержка этого встроена в компилятор Java.
Однако вы не можете, объявите переменную класса 'a', которая зависит от другой переменной класса 'b', которая еще не объявлена. Зависимые объявления переменных класса должны отображаться в обратном порядке их зависимости.
По касательной, Most, если не все IDE предупредит вас, если ваш код содержит незаконные ссылочные ошибки.
Нелегальные прямые ссылки описаны в разделе 8.3.2.3 JLS.
Ответ 2
Это в основном просто порядок чтения компилятором вещей, если у вас есть
int c = 3
int a = b;
int b = 5;
компилятор будет читать его сверху вниз, поэтому он будет se первой строкой, которая объявляет переменную 'c', и назначает ей 3, и это нормально, тогда она встретит вторую строку, которая объявит переменную "a", а затем пытается присвоить ей "b".
Но теперь у компилятора есть проблема: что это за "б"? Он еще только узнал о "c", и совсем недавно "a", но он не знает ничего, что называется "b", поскольку для компилятора он еще не объявлен. Итак, так как компилятор не может справиться со всеми путаницами, он останавливается и оставляет вас для того, чтобы понять, что вы сделали, чтобы рассердить его.
Итак, прямая ссылочная часть будет ссылкой на то, что еще не существует. Вперед вовремя, возможно.
Ответ 3
В простых терминах это означает ссылку (доступ к переменной, вызов функции), которая далее находится в файле кода.
static int x=getY();
static int y=5;
static int getY() { return y; }
- Значение
- x устанавливается на результат getY()
- getY() вызывается до того, как значение y установлено в 5
- Значение x поэтому 0 (по умолчанию целое число)
- значение y равно 5
Ответ 4
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 {
}
********* Обратитесь к CASE - 1 *********
Переменная перекрестного ссылочного экземпляра не допускается, поскольку компилятор не уверен в типе значения, которое мы перенаправляем, или может быть даже возможно, что такая переменная не существует.
Рассмотрим пример: -
int a = b;
boolean b = false;
Если в приведенном выше случае разрешена прямая ссылка, это может создать хаос.
int a = b; // What is b? is it a primitive variable or a value or a object reference
в приведенном выше примере я решил не объявлять b, и теперь, если такое назначение было разрешено java, тогда это будет кошмар.
********** Обратитесь к CASE - 2 *********
Статические переменные загружаются перед переменными экземпляра и, следовательно, перенаправляются на статические переменные и присваивают их переменной экземпляра отлично.