Tôi đã trải qua this question on legality of forward references nhưng không rõ ràng về ý nghĩa của forward references
bằng ngôn ngữ Java. Ai đó có thể vui lòng giải thích với sự giúp đỡ của một ví dụ?Cái gì được gọi là tham chiếu chuyển tiếp trong Java?
Trả lời
Đây là lỗi biên dịch cụ thể. Và tất cả về việc sắp xếp các khai báo biến lớp. Hãy sử dụng một số mã cho mục đích minh họa:
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();
}
Như bạn thấy, Java cho phép bạn tham khảo một lớp biến trong một phương pháp lớp, thậm chí nếu việc khai báo của biến đến sau phương pháp . Đây là một ví dụ về tham chiếu chuyển tiếp (hợp pháp) và hỗ trợ cho việc này được xây dựng trong trình biên dịch Java.
gì bạn không có thể làm, mặc dù là khai báo một biến lớp 'a' mà phụ thuộc vào một lớp biến 'b' mà chưa được công bố được nêu ra. Các khai báo biến lớp phụ thuộc phải xuất hiện theo thứ tự ngược lại của sự phụ thuộc của chúng.
Trên tang, Hầu hết, nếu không phải tất cả IDE sẽ cảnh báo bạn nếu mã của bạn chứa lỗi tham chiếu bất hợp pháp.
Tham chiếu chuyển tiếp bất hợp pháp được bao gồm trong section 8.3.2.3 của JLS.
Trong thuật ngữ đơn giản, nó có nghĩa là tham chiếu (truy cập một biến, gọi hàm) nằm sâu hơn trong tệp mã.
static int x=getY();
static int y=5;
static int getY() { return y; }
do đó
- giá trị x được đặt thành kết quả của GetY()
- GetY() được gọi trước khi giá trị y được thiết lập để giá trị 5
- x là 0 (mặc định số nguyên)
- Giá trị của y là 5
Đó là về cơ bản chỉ là thứ tự mà mọi thứ được đọc bởi trình biên dịch, nếu bạn có
int c = 3
int a = b;
int b = 5;
trình biên dịch sẽ đọc nó từ trên xuống dưới, vì vậy nó sẽ se dòng đầu tiên, trong đó khai báo một biến ' c ', và gán nó cho 3, và đó là tốt, sau đó nó sẽ gặp phải dòng thứ hai, mà tuyên bố một biến' a ', và sau đó cố gắng để gán nó vào' b '.
Nhưng bây giờ, trình biên dịch có vấn đề: Điều 'b' này là gì? Nó chỉ mới biết về 'c', và gần đây là 'a', nhưng nó không có kiến thức gì được gọi là 'b', vì trình biên dịch, nó chưa được khai báo. Vì vậy, kể từ khi trình biên dịch không thể xử lý tất cả sự nhầm lẫn, nó dừng lại, và lá bạn để tìm những gì bạn đã làm để tức giận nó.
Vì vậy, phần tham chiếu chuyển tiếp sẽ là tham chiếu đến nội dung chưa tồn tại. Chuyển tiếp trong thời gian có lẽ ..
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 {
}
********* Tham khảo CASE - 1 *********
Forward tham khảo biến dụ không được phép như trình biên dịch không phải là chắc chắn về loại giá trị mà chúng tôi đang chuyển tiếp tham chiếu hoặc thậm chí có thể là không có biến nào tồn tại.
Hãy xem xét một ví dụ: -
int a = b;
boolean b = false;
Nếu tham khảo về phía trước được cho phép trong trường hợp trên thì nó có thể tạo ra một sự tàn phá.
int a = b; // What is b? is it a primitive variable or a value or a object reference
trong ví dụ trên tôi đã quyết định không khai báo b và bây giờ nếu việc chuyển nhượng đó được java cho phép thì đó sẽ là một cơn ác mộng.
********** Tham khảo CASE - 2 *********
biến tĩnh được nạp trước khi biến dụ và do đó mong tham chiếu các biến tĩnh và gán chúng cho instance variable là hoàn toàn tốt đẹp
- 1. Tham chiếu chuyển tiếp trong C là gì?
- 2. Tham chiếu Chuyển tiếp Pháp lý Java
- 3. tham chiếu cứng trong java là gì?
- 4. Chữ cái lớp trong Java là gì?
- 5. Biến tham chiếu trong C++ là gì?
- 6. khai báo tham chiếu chuyển tiếp để chặn typedef?
- 7. Biến tham chiếu đối tượng là gì?
- 8. 'Tham chiếu toàn cầu JNI' là gì
- 9. Có gì bên trong biến tham chiếu trong Java?
- 10. Cuộc gọi Collections.checkedList() trong java là gì?
- 11. Sự khác biệt giữa tham chiếu chuyển tiếp và *?
- 12. Loại tham chiếu rvalue được đặt tên là gì?
- 13. Tự 'tham chiếu' trong một @classmethod là gì?
- 14. Kiểu tham chiếu số nguyên trong C# là gì?
- 15. Cửa hàng tham chiếu là gì?
- 16. Giao diện gọi lại trong Java là gì?
- 17. Tham số được chuyển bởi tham chiếu const được trả về bởi tham chiếu const
- 18. Khi nào là tham chiếu chương trình con trong @INC được gọi?
- 19. Tham chiếu cho ´System.Data.Entity.Infrastructure´ là gì?
- 20. Trong Java, tham chiếu đến Class.class làm gì?
- 21. java Tham chiếu Integer
- 22. Java: Cách tốt nhất để chuyển int bằng tham chiếu
- 23. Mục đích của việc sử dụng tham chiếu đến tham chiếu trong C++ là gì?
- 24. Trong Python, số tham chiếu của tham chiếu cyclic là gì và tại sao?
- 25. Cách ISO C++ để trực tiếp xác định hàm chuyển đổi để tham chiếu đến mảng là gì?
- 26. => được gọi là gì trong Scala?
- 27. Sự khác nhau giữa các tham chiếu và các đối tượng trong java là gì?
- 28. Làm cách nào để triển khai các tham chiếu chuyển tiếp trong trình biên dịch?
- 29. một callback trong java là gì
- 30. JAVA: tham chiếu được xác định trong vòng lặp