內(nèi)部類可以是final類嗎 匿名內(nèi)部類訪問(wèn)局部變量,為什么final?
匿名內(nèi)部類訪問(wèn)局部變量,為什么final?這是變量作用域的問(wèn)題,因?yàn)槟涿麅?nèi)部類出現(xiàn)在方法內(nèi)部。如果要訪問(wèn)方法的參數(shù)或方法中定義的變量,則必須將這些參數(shù)和變量修改為final。盡管匿名內(nèi)部類在方法內(nèi)部,
匿名內(nèi)部類訪問(wèn)局部變量,為什么final?
這是變量作用域的問(wèn)題,因?yàn)槟涿麅?nèi)部類出現(xiàn)在方法內(nèi)部。如果要訪問(wèn)方法的參數(shù)或方法中定義的變量,則必須將這些參數(shù)和變量修改為final。
盡管匿名內(nèi)部類在方法內(nèi)部,但內(nèi)部類被編譯為外部。內(nèi)部這意味著內(nèi)部類的位置和外部類中的方法處于同一級(jí)別。外部類中方法中的變量或參數(shù)只是方法的局部變量,這些變量或參數(shù)的作用域僅在方法內(nèi)部有效。由于內(nèi)部類和方法在編譯時(shí)處于同一級(jí)別,因此只有在方法中的變量或參數(shù)是final時(shí)才能引用內(nèi)部類。
匿名內(nèi)部類訪問(wèn)局部變量為什么final?
確保不會(huì)在匿名內(nèi)部類內(nèi)部或外部修改局部變量。因?yàn)槟涿麅?nèi)部類實(shí)際上復(fù)制了一個(gè)局部變量并在匿名內(nèi)部類中使用它。如果未設(shè)置為final,則局部變量將被外部修改,這將導(dǎo)致與匿名內(nèi)部類中的副本不一致,這在邏輯上是不合理的。所以Java虛擬機(jī)就是這樣設(shè)計(jì)的,強(qiáng)制局部變量是final,這在語(yǔ)義上是一致的。
匿名內(nèi)部類調(diào)用參數(shù)時(shí)為什么參數(shù)必須是final的?
public class InnerClass{
public InnerClass(字符串名稱,字符串年齡){這個(gè)。內(nèi)部類$name=姓名這個(gè)。內(nèi)部類$age=age
}
public void display(){系統(tǒng)輸出打印( 這個(gè)。內(nèi)部類$name“---”這個(gè)。內(nèi)部類$age)
}
}
因此,根據(jù)上面的代碼,內(nèi)部類不直接調(diào)用方法傳遞的參數(shù),而是使用自己的構(gòu)造函數(shù)來(lái)備份傳入的參數(shù)。內(nèi)部方法調(diào)用自己的屬性,而不是外部方法傳遞的參數(shù)。
到目前為止,我們還沒(méi)有解釋為什么它是最終的??jī)?nèi)部類中的屬性和外部方法的參數(shù)從外觀上看是一樣的,但實(shí)際上不是,所以可以隨意更改。也就是說(shuō),內(nèi)部類中屬性的改變不會(huì)影響外部參數(shù)。然而,從程序員的角度來(lái)看,這是不可行的。畢竟,從程序的角度來(lái)看,這兩個(gè)基本參數(shù)可以改變是一樣的。如果內(nèi)部類需要更改,但外部方法的形式參數(shù)不更改,則很難理解和接受。因此,為了保持參數(shù)的一致性,規(guī)定使用final,以避免形式參數(shù)不變。