Подтвердить что ты не робот

Что называется прямой ссылкой в ​​Java?

Я прошел через этот вопрос о законности прямых ссылок, но неясно, что означает forward references в языке Java. Может кто-нибудь объяснить с помощью примера?

4b9b3361

Ответ 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 *********

Статические переменные загружаются перед переменными экземпляра и, следовательно, перенаправляются на статические переменные и присваивают их переменной экземпляра отлично.