Java final 修飾符
導語:final從字面上理解含義為“最後的,最終的”。在Java中也同樣表示出此種含義。下面是相關知識,歡迎參考!
final可以用來修飾變量(包括類屬性、對象屬性、局部變量和形參)、方法(包括類方法和對象方法)和類。
1. final修飾類:
final修飾類即表示此類已經是“最後的、最終的”含義。因此,用final修飾的類不能被繼承,即不能擁有自己的子類。
如果視圖對一個已經用final修飾的類進行繼承,在編譯期間或發生錯誤。
2. final修飾方法:
final修飾的方法表示此方法已經是“最後的、最終的”含義,亦即此方法不能被重寫(可以重載多個final修飾的方法)。
此處需要注意的一點是:因為重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時訪問控制權限為private,
將會導致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和參數,此時不再產生重寫與final的'矛盾,而是
在子類中重新定義了新的方法。
1 public class B extends A {
2
3 public static void main(String[] args) {
4
5 }
6
7 public void getName() {
8
9 }
10 }
11
12 class A {
13
14 /**
15 * 因為private修飾,子類中不能繼承到此方法,因此,子類中的getName方法是重新定義的、
16 * 屬於子類本身的方法,編譯正常
17 */
18 private final void getName() {
19
20 }
21
22 /* 因為pblic修飾,子類可以繼承到此方法,導致重寫了父類的final方法,編譯出錯
23 public final void getName() {
24
25 }
26 */
27 }
3. final 修飾變量:
final修飾的變量表示此變量是“最後的、最終的”含義。一旦定義了final變量並在首次為其顯示初始化後,final修飾的變量值不可被改變。
這裏需要注意以下幾個問題:
1. final修飾的變量,無論是類屬性、對象屬性、形參還是局部變量,這些變量都是需要進行顯示初始化(即為其顯示指定初始值)。
對於final修飾的形參,由於是實參傳遞過來的,很好理解。
對於final修飾的局部變量,與未用final修飾的變量一樣,都是需要顯示初始化。即局部變量都是需要顯示初始化的。
對於一般的類屬性和對象屬性,由類和對象的初始化過程中可以看出,首先都進行了默認初始化。然後對有顯示賦值的變量才再進行顯示初始化。
但對final修飾的類屬性和對象屬性而言,如果不顯示初始化,其默認將是進行默認初始化後的值,這與final本身出發點矛盾,因此,Java語法規定:
final修飾的類屬性和變量屬性必須要進行顯示初始化賦值。
另外,無論對於基本數據類型還是引用數據類型,final修飾的變量都是首次顯示初始化後值都不能修改。對於基本數據類型,很好理解。對於引用
數據類型,引用變量指向的是實際的對象,但其存儲的是所指向對象的地址,因此,其值不能修改並不意味着其所指向的對象不能修改。
4. final修飾變量後導致的“宏替換”/"宏變量"問題
Java 中宏變量/宏替換指的是在java代碼中在編譯期某些變量能夠直接被其本身的值所替換,編譯到s文件中。因此,編譯後的s文件中已經不存在此變了。
在String類型的變量中,有時候經常遇到如下情況:
1 public class Test {
2
3 public static void main(String[] args) {
4
5 String country = "China";
6 String name = "qqyumidi";
7
8 String userInfo = country + name; //編譯後此處依然是country和name變量
9 String user = "China" + "qqyumidi"; //編譯後此處直接變成Chinaqqyumidi
10
11 }
12 }
在上述代碼中的第9行,編譯後的變量結果直接為Chinaqqyumidi。而第8行代碼中,由於country和name都是普通的變量,編譯器無法在編譯時直接確定userInfo的值,因此
此處編譯後結果不直接是Chinaqqyumidi。
但是,如果希望第8行中的代碼在編譯期直接就能表示為Chinaqqyumidi,就需要用到final修飾符對country和name變量進行修飾。
原因:final修飾符修飾的變量在由於其本身的特性,在編譯期就能直接確定其值,且此值不可變。在編譯過程中,可以直接將其變量直接轉換成其值本身去表示。
1 public class Test {
2
3 public static void main(String[] args) {
4
5 final String country = "China";
6 final String name = "qqyumidi";
7
8 String userInfo = country + name; //編譯後此處直接是Chianqqyumidi
9
10 }
11 }
-
Java Class文件是什麼
Class類是在Java語言中定義一個特定類的實現。一個類的定義包含成員變量,成員方法,還有這個類實現的接口,以及這個類的父類。Class類的對象用於表示當前運行的Java應用程序中的類和接口。比如:每個數組均屬於一個Class類對象,所有具有相同元素類型和維數的數組共享...
-
java面試自我介紹範文
引導語:Java面試自我介紹應以突顯自我能力為主,表現出與眾不同的才幹和學識。以下是本站小編分享給大家的2017java面試自我介紹範文,歡迎閲讀!範文一我叫趙,我的同學更都喜歡稱呼我的英文名字,叫,六月的意思,是君的諧音。我來自安徽的市,在21年我以市全市第一名的成績...
-
java的nio的使用示例分享
在jdk1.4中提出的技術,非阻塞IO,採用的是基於事件處理方式。傳統的io技術為阻塞的`,比如讀一個文件,惹read方法是阻塞的,直到有數據讀入。歸納為:1、javaio為阻塞,在打開一個io通道後,read將一直等待在端口一邊讀取字節內容,如果沒有內容進來,read相當於阻塞掉了。2、在1...
-
Java 異步回調機制實例解析
回調,回調。要先有調用,才有調用者和被調用者之間的回調。下面小編給大家介紹Java異步回調機制實例解析,歡迎閲讀!Java異步回調機制實例解析一、什麼是回調軟件模塊之間總是存在着一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。回調是一種...
相關文章
- Java中通過final關鍵字面向對象的詳解
- Java中Finally關鍵字
- JAVA認證基礎知識:JavaNativeInterface學習小結
- Java中final關鍵字用法的講解
- A Lifeguard at Johns Beach Saved a Drowning Child,A Lifeguar英語作文
- Java中finally的問題
- 講解Java編程中finally語句的使用方法
- java基礎之final、finally和finalize的區別
- Java final 修飾符知識點總結範例
- java的String=a; a==null和a.equals(null)這兩個判斷有什麼區別