Ich war durch this question on legality of forward references, aber nicht klar, was mit forward references
in Java Sprache gemeint ist. Kann jemand bitte anhand eines Beispiels erklären?Was ist eine Vorwärtsreferenz in Java?
Antwort
Dies ist speziell ein Kompilierungsfehler. Und alles über das Ordnen von Klassenvariablen-Deklarationen. Lassen Sie uns einige Code zu illustrativen Zwecken verwenden:
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();
}
Wie Sie sehen können, Java können Sie eine Klassenvariable in einem Klassenmethode, auch wenn die Deklaration der Variablen nachreferenzieren kommt das Verfahren . Dies ist ein Beispiel für eine (legale) Vorwärtsreferenz, und Unterstützung dafür ist in den Java-Compiler integriert.
Was Sie nicht zwar tun, ist eine Klassenvariable deklarieren ‚a‘ das hängt von einer anderen Klasse Variable ‚b‘, die noch nicht erklärt wurde. Deklarationen abhängiger Klassenvariablen müssen in umgekehrter Reihenfolge ihrer Abhängigkeit angezeigt werden.
Auf einer Tangente, Most, wenn nicht alle IDEs warnen Sie, wenn Ihr Code ungültige Referenzfehler enthält.
Illegale Vorwärtsreferenzen sind in section 8.3.2.3 der JLS enthalten.
In einfachen Worten bedeutet es Referenzieren (Zugriff auf eine Variable, Aufruf einer Funktion), die weiter unten in der Codedatei ist.
static int x=getY();
static int y=5;
static int getY() { return y; }
- Wert x auf das Ergebnis der getY gesetzt()
- getY() vor Wert genannt wird der y daher bis 5
- x den Wert gesetzt wird, ist 0 (Standard integer)
- y's Wert ist 5
Es ist im Grunde nur die Ordnung, die Dinge vom Compiler gelesen werden, wenn Sie
int c = 3
int a = b;
int b = 5;
der Compiler es von oben nach unten wird gelesen haben, so wird es sich die erste Zeile, die eine Variable erklärt ' c ', und weist es auf 3, und das ist in Ordnung, dann wird es die zweite Zeile, die eine Variable' a 'deklariert, und dann versucht, es zu' b 'zuweisen.
Aber jetzt hat der Compiler ein Problem: Was ist das 'b' Ding? Es hat nur noch von 'c' und erst kürzlich 'a' gelernt, aber es hat nichts, was 'b' genannt wird, da es für den Compiler noch nicht deklariert wurde. Also, da der Compiler nicht mit der ganzen Verwirrung umgehen kann, hört er auf und lässt Sie herausfinden, was Sie getan haben, um ihn zu verärgern.
Der Forward-Referenzteil wäre also ein Verweis auf etwas, das noch nicht existiert. vielleicht in der Zeit vorwärts ..
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 Siehe - 1 *********
Vorwärts-Instanzvariable Referenzierung nicht als Compiler erlaubt ist, ist nicht sicher von der Art von Wert, auf den wir uns beziehen, oder es könnte sogar möglich sein, dass keine solche Variable existiert.
Betrachten wir ein Beispiel: -
int a = b;
boolean b = false;
Wenn vorwärts Referenzierung in obigen Fall erlaubt ist, dann könnte es ein Chaos schaffen.
int a = b; // What is b? is it a primitive variable or a value or a object reference
im obigen Beispiel ich nicht und jetzt zu erklären, b entschieden haben, wenn eine solche Zuordnung von Java erlaubt wurden, dann wird es ein Alptraum sein.
********** CASE Siehe - 2 *********
Statische Variablen geladen werden, bevor die Instanzvariablen und damit vorwärts Referenzierung statischen Variablen und diese Instanzvariable Zuweisen ist völlig in Ordnung
- 1. Was ist Vorwärtsreferenz in C?
- 2. Was ist eine Java-Sammlung?
- 3. Vorwärtsreferenz mit einem Lookbehind C#?
- 4. Was ist eine Treiberklasse? (Java)
- 5. Java - Was ist eine Instanzvariable?
- 6. Was ist eine native Implementierung in Java?
- 7. Was ist eine Klassenbibliothek in Java?
- 8. Was ist eine polymorphe Methode in Java?
- 9. Was ist in Java Objektkopf
- 10. Was ist .intValue() in Java?
- 11. Was ist eine Java 8 "Ansicht"?
- 12. Was ist ++ int in Java?
- 13. Was ist StampedLock in Java?
- 14. Was ist Serialisierung in Java?
- 15. Was ist Jar in Java?
- 16. Was ist lvmid in Java?
- 17. Was ist in Java strcpy?
- 18. Was genau ist Java?
- 19. Java: Was ist "for (;;)"
- 20. Was ist eine Schnittstelle?
- 21. Was ist eine Invariante?
- 22. Ausarbeiten, was ist eine Systemdatei in Windows von Java
- 23. Was ist eine einzelne Genauigkeit/doppelte Genauigkeit in Java?
- 24. Was ist SerialVersionUID in Serialisierung in Java?
- 25. Was ist die maximale Vererbungsebene in Java?
- 26. Was ist innerhalb einer Referenzvariablen in Java?
- 27. Was ist die Seriennummer in Java?
- 28. Was ist GSList * in Java-DBus?
- 29. Was ist SuppressWarnings ("unchecked") in Java? Irgendwann
- 30. Was ist in Java monad analog?