Rumah >Java >javaTutorial >Bagaimana untuk menyelesaikan masalah rujukan hadapan haram di java
Ini ialah kod yang salah:
class BB { static int a = 0 ; public BB() { a++ ; System.out.println("执行BB" + a) ; } public void printA() { System.out.println("a= " + a) ; } } public class CC { static { a = new BB() ; a.printA() ; //报错说非法的前向引用 } static BB a = new BB() ; public staic void main(String args[]) { CC c = new CC() ; } }
Mengapa saya memulakan a dalam blok kod statik dan masih mendapat ralat?
Sebabnya melibatkan sekatan Java pada pembolehubah ahli semasa proses permulaan:
Jika pembolehubah ahli a memenuhi empat mata berikut, pembolehubah ahli mesti diisytiharkan sebelum digunakan
Tetapkan C sebagai kelas atau antara muka yang secara langsung mengandungi pembolehubah ahli
Jika a muncul dalam C atau ahli statik/ahli bukan statik Permulaan atau dalam statik atau blok kod bukan statik dalam C
Jika a bukan nilai ketaksamaan tugasan
Diakses dengan nama ringkas
Dalam kod yang saya tulis, a.printA() ; muncul dalam blok kod statik CC dan diakses terus melalui nama mudah (iaitu, menggunakan secara langsung), dan Ia bukan nilai l daripada ketidaksamaan tugasan, jadi ralat "rujukan hadapan haram" akan dilaporkan
Ini ialah kod asal dalam spesifikasi bahasa Java (bahasa Cina di dalamnya adalah anotasi saya sendiri):
class UseBeforeDeclaration { static { x = 100; // ok - assignment , 赋值表达式的左值 int y = x + 1; // error - read before declaration , 赋值表达式的右值 int v = x = 3; // ok - x at left hand side of assignment , 左值 int z = UseBeforeDeclaration.x * 2; // ok - not accessed via simple name , 是通过类.静态变量 的形式访问, 而非直接简单访问 Object o = new Object() { void foo() { x++; } // ok - occurs in a different class , 不是CC的代码块或成员初始化中,而是在一个全新的内部类的函数中 { x++; } // ok - occurs in a different class , 在一个内部类的代码块中, 和上一个类似 }; } { j = 200; // ok - assignment j = j + 1; // error - right hand side reads before declaration , 第二个右值 int k = j = j + 1; // error - illegal forward reference to j , 第三个是右值 int n = j = 300; // ok - j at left hand side of assignment , 左值 int h = j++; // error - read before declaration , 右值, 并参与了自增运算 int l = this.j * 3; // ok - not accessed via simple name 通过this.j进行访问, 非直接简单访问 Object o = new Object() { void foo() { j++; } // ok - occurs in a different class { j = j + 1; } // ok - occurs in a different class }; } int w = x = 3; // ok - x at left hand side of assignment int p = x; // ok - instance initializers may access static fields static int u = (new Object() { int bar() { return x; } }).bar(); // ok - occurs in a different class static int x; int m = j = 4; // ok - j at left hand side of assignment int o = (new Object() { int bar() { return j; } }).bar(); // ok - occurs in a different class int j; }
Contoh rujukan hadapan haram:
Jadi mengapa? kod seperti i="1234";
Ini kerana Java mempunyai "konsesi" untuk beberapa situasi ini ialah "Pembolehubah yang dirujuk dengan nama mudah boleh muncul dalam kedudukan nilai, tetapi tidak dalam kedudukan nilai". kod sebelumnya berfungsi, tetapi System.out.println(i) tidak, kerana ini adalah rujukan nilai.
Tujuannya adalah untuk mengelakkan pemulaan gelung dan tingkah laku pemula tidak normal yang lain.
Apakah rujukan pekeliling Lihat contoh berikut:
privateinti=j; privateintj=i;
Jika tiada semakan wajib yang dinyatakan di atas, maka kedua-dua baris kod ini akan lulus kompilasi, tetapi ia mudah dilakukan Ia dapat dilihat bahawa i dan j sebenarnya tidak diberikan nilai kerana kedua-dua pembolehubah tidak diinisialisasi (Java menetapkan bahawa semua pembolehubah mesti dimulakan sebelum digunakan)
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah rujukan hadapan haram di java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!