1 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
假設(shè)以下類
public class MyClass {
int a = b;
int b = 10;
}
JLS 8.3.3。在你的情況下:
使用實(shí)例變量,其聲明在使用后以文本形式出現(xiàn)有時(shí)會(huì)受到限制
- 使用是 C 的實(shí)例變量初始化程序或 C 的實(shí)例初始化程序中的簡(jiǎn)單名稱
現(xiàn)在,使用該成員this允許您訪問已使用默認(rèn)值 ( a = 0, b = 0) 聲明但尚未完全初始化的實(shí)例。如果您檢查以下結(jié)果,這是可見的:
public class MyClass {
int a = this.b;
int b = 10;
}
你不會(huì)得到預(yù)期的價(jià)值:
new MyClass().a //0
new MyClass().b //10
我無法解釋為什么這是合法的,因?yàn)檫@永遠(yuǎn)不會(huì)給出正確的值。我們可以找到一些關(guān)于為什么存在限制的解釋:
上述限制旨在在編譯時(shí)捕獲循環(huán)或其他格式錯(cuò)誤的初始化。
但是為什么允許this工作......
知道在實(shí)例初始化期間,會(huì)發(fā)生以下操作:
會(huì)員聲明
按順序執(zhí)行塊和字段初始化
構(gòu)造函數(shù)執(zhí)行
給出一些奇怪的行為:
public class MyClass {
{
b = 10;
}
int a = this.b;
int b = 5;
{
b = 15;
}
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.a); //10
System.out.println(m.b); //15
}
}
我會(huì)限制構(gòu)造函數(shù)中的初始化。
添加回答
舉報(bào)