Java中關於final關鍵字的一些補充

對於類方法 ,靜態初始化塊、聲明二選一指定初始值
對於實例變量 ,靜態初始化塊、聲明、構造器三選一指定初始值

Java設計的一個缺陷: ,final成員變量未賦值時,不能通過syso直接訪問,但卻可以通過print方法間接的打印final修飾的成員變量,輸出爲0;

對於用fina修飾引用變量 ,僅僅限制的是對該變量的地址值,只要地址值不變,變量的屬性值是可以改變的,即final修飾的引用類型變量不能夠給他重新賦值,但可以改變引用類型變量所引用對象的內容。

宏變量 ,final修飾的變量其實本質上是一種宏變量,當定義了final變量以後,編譯器會把程序中所有用到該變量的地方直接替換成該變量的值

關於宏變量

String s1 = "ab";
String s2 = "a" + "b";
syso(s1 == s2 )//true

String s3 = "a" ;
Stirng s4 = "b" ;
String s5 = s3 + s4 ;
system.out.println(s1 == s5) //false ;

對於s2 ,在編譯時就可以確定下來,因此s2直接引用常量池中已有的字符串

對於s5 ,在編譯只是將兩個普通變量拼接,編譯不會執行宏替換,所以無法編譯期就確定s5的值,不能直接指向字符串池中緩存的字符串。

如果給s3s4加上final修飾,那麼會默認的使用宏替換,這樣在編譯期就能夠確定s5的值,也就是直接指向字符串池中緩存的字符串。(final修飾的實例變量,只有定義時指定了初始值纔會有宏效果)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章