Java final 修飾符知識點總結範例
final從字面上理解含義爲“最後的,最終的”。在Java中也同樣表示出此種含義。
final可以用來修飾變量(包括類屬性、對象屬性、局部變量和形參)、方法(包括類方法和對象方法)和類。
1. final修飾類:
final修飾類即表示此類已經是“最後的、最終的”含義。因此,用final修飾的類不能被繼承,即不能擁有自己的子類。
如果視圖對一個已經用final修飾的類進行繼承,在編譯期間或發生錯誤。
2. final修飾方法:
final修飾的方法表示此方法已經是“最後的、最終的”含義,亦即此方法不能被重寫(可以重載多個final修飾的方法)。
此處需要注意的一點是:因爲重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時訪問控制權限爲private,
將會導致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和參數,此時不再產生重寫與final的矛盾,而是
在子類中重新定義了新的方法。
public class B extends A { public static void main(String[] args) { } public void getName() { }}class A { /** * 因爲private修飾,子類中不能繼承到此方法,因此,子類中的getName方法是重新定義的、 * 屬於子類本身的方法,編譯正常 */ private final void getName() { } /* 因爲pblic修飾,子類可以繼承到此方法,導致重寫了父類的final方法,編譯出錯 public final void getName() { } */}
3. final 修飾變量:
final修飾的變量表示此變量是“最後的.、最終的”含義。一旦定義了final變量並在首次爲其顯示初始化後,final修飾的變量值不可被改變。
這裏需要注意以下幾個問題:
1. final修飾的變量,無論是類屬性、對象屬性、形參還是局部變量,這些變量都是需要進行顯示初始化(即爲其顯示指定初始值)。
對於final修飾的形參,由於是實參傳遞過來的,很好理解。
對於final修飾的局部變量,與未用final修飾的變量一樣,都是需要顯示初始化。即局部變量都是需要顯示初始化的。
對於一般的類屬性和對象屬性,由類和對象的初始化過程中可以看出,首先都進行了默認初始化。然後對有顯示賦值的變量纔再進行顯示初始化。
但對final修飾的類屬性和對象屬性而言,如果不顯示初始化,其默認將是進行默認初始化後的值,這與final本身出發點矛盾,因此,Java語法規定:
final修飾的類屬性和變量屬性必須要進行顯示初始化賦值。
另外,無論對於基本數據類型還是引用數據類型,final修飾的變量都是首次顯示初始化後值都不能修改。對於基本數據類型,很好理解。對於引用
數據類型,引用變量指向的是實際的對象,但其存儲的是所指向對象的地址,因此,其值不能修改並不意味着其所指向的對象不能修改。
4. final修飾變量後導致的“宏替換”/"宏變量"問題
Java 中宏變量/宏替換指的是在java代碼中在編譯期某些變量能夠直接被其本身的值所替換,編譯到s文件中。因此,編譯後的s文件中已經不存在此變了。
在String類型的變量中,有時候經常遇到如下情況:
public class Test { public static void main(String[] args) { String country = "China"; String name = "qqyumidi"; String userInfo = country + name; //編譯後此處依然是country和name變量 String user = "China" + "qqyumidi"; //編譯後此處直接變成Chinaqqyumidi }}
在上述代碼中的第9行,編譯後的變量結果直接爲Chinaqqyumidi。而第8行代碼中,由於country和name都是普通的變量,編譯器無法在編譯時直接確定userInfo的值,因此
此處編譯後結果不直接是Chinaqqyumidi。
但是,如果希望第8行中的代碼在編譯期直接就能表示爲Chinaqqyumidi,就需要用到final修飾符對country和name變量進行修飾。
原因:final修飾符修飾的變量在由於其本身的特性,在編譯期就能直接確定其值,且此值不可變。在編譯過程中,可以直接將其變量直接轉換成其值本身去表示。
public class Test { public static void main(String[] args) { final String country = "China"; final String name = "qqyumidi"; String userInfo = country + name; //編譯後此處直接是Chianqqyumidi }}
相關文章
-
Java final 修飾符
導語:final從字面上理解含義爲“最後的,最終的”。在Java中也同樣表示出此種含義。下面是相關知識,歡迎參考!final可以用來修飾變量(包括類屬性、對象屬性、局部變量和形參)、方法(包括類方法和對象方法)和類。 1. final修 -
java基礎之final、finally和finalize的區別
紅棗是可以和木耳一起煮湯喝的,而且營養價值很高,適合病後補身體。那麼紅棗木耳湯什麼時候喝最好?紅棗木耳湯什麼時候吃最好?下面就跟本站一起具體看看紅棗木耳湯最佳飲用時間等相關內容。紅棗木耳湯簡介紅棗木 -
JAVA認證基礎知識:JavaNativeInterface學習小結
JNI是Java Native Interface的縮寫,中文爲JAVA本地調用。使用JNI可以很方便的用我們的Java程序調用C/C++程序。很多時候,某些功能用Java無法實現,比如說涉及到底層驅動的一些功能,這時候我們就可以利用JNI來調用C或者C++ -
Java語言中修飾符的基礎知識
java中提供的一些修飾符,這些修飾符可以修飾類、變量和方法,下面小編爲大家帶來了關於Java語言中修飾符的基礎知識,歡迎大家閱讀! Java語言中修飾符的基礎知識一.在java中提供的一些修飾符,這些修飾符可以修飾類、變量 -
Java中finally的問題
引導語:finally是終極的,那麼Java中的lly又是怎樣的呢,以下是本站小編分享給大家的Java中finally的問題,歡迎閱讀! 一個比較繞的例子:try {try {try {String s = null;At(0);} catch(NullPointerException nu) {tln(nu) -
Java中Finally關鍵字
Java 編程的人都知道 finally 語句塊的作用和用法。以下就是小編精心推薦Java中Finally關鍵字,希望對大家有幫助!final:禁止多態開關~修飾變量:變量不能被改變修飾類:類不能被繼承修飾方法:方法不能被重寫finally:用在異常 -
java的String=a; a==null和a.equals(null)這兩個判斷有什麼區別
1、String 的==與equal()在對字符串的相等判斷,==判斷的是地址是否相同,equal()判斷的是字符值是否相同。大多數時候==跟equal()的結果都是相同的。這是因爲String對象是不變模式的,如果你不是明確地new一個String對象,Ja -
講解Java編程中finally語句的使用方法
在java中的finally關鍵一般與try一起使用,在程序進入try塊之後,無論程序是因爲異常而中止或其它方式返回終止的,finally塊的內容一定會被執行,寫個例子來說明下:public class TryAndFinallyTest { public static void main -
Java中final關鍵字用法的講解
1. final variablefinal variable 就是一個常量,一旦被初始化就不可以被改變。class Test1 { final double PI = 3.14; //常量的名稱最好大寫 public Test1(){ PI = 3.14; } void test(){ tln("PI is: " + PI); } publ -
Java認證基礎知識:java字符串轉化整型問題
“碗碗腔皮影戲是與崑曲相呼應的典雅的戲曲藝術,是一種中國傳統文人的‘沙龍藝術’,今天能夠走到深圳來展示,讓深圳的觀衆接觸並瞭解它,是很有意義的。”4日晚,陝西碗碗腔德慶皮影社在關山月美術館的演出“震撼”了許多在