Java教程35—Java中的final關鍵字用法
阿新 • • 發佈:2018-12-02
在本教程中,我們將學習final關鍵字的用法。
final關鍵字可以與變數,方法和類一起使用。
我們將詳細介紹以下主題。
- 1)final變數
- 2)final方法
- 3)final變數
1)final變數
final變數是常量。
初始化後,我們無法更改final變數的值。
讓我們看看下面的程式碼:
class Demo{ final int MAX_VALUE=99; void myMethod(){ MAX_VALUE=101; } public static void main(String args[]){ Demo obj=new Demo(); obj.myMethod(); } } Output: Exception in thread "main" java.lang.Error: Unresolved compilation problem: The final field Demo.MAX_VALUE cannot be assigned at beginnersbook.com.Demo.myMethod(Details.java:6) at beginnersbook.com.Demo.main(Details.java:10)
我們在上面的程式中遇到了編譯錯誤,因為我們試圖修改final變數“MAX_VALUE”的值。
注意:常量名稱使用大寫被認為是一種好習慣。
空白的final變數
在宣告時未初始化的final變數稱為空白final變數。
我們必須在類的建構函式中初始化空白的final變數,否則會丟擲一個編譯錯誤(錯誤:變數MAX_VALUE可能尚未初始化)。
這是在類中使用空白final變數的方式:
class Demo{ //空白final變數 未初始化 final int MAX_VALUE; Demo(){ //必須在建構函式中初始化 MAX_VALUE=100; } void myMethod(){ System.out.println(MAX_VALUE); } public static void main(String args[]){ Demo obj=new Demo(); obj.myMethod(); } } Output: 100
什麼是空白的final變數?
假設我們有一個Student類,其中有一個名為Roll_No的成員變數。
由於Roll_No不應該在學生註冊後更改,我們可以將其宣告為類中的final變數。
但我們無法提前初始化ROLL_NO學生們(否則所有學生都會有相同的卷號)。
在這種情況下,我們可以宣告ROLL_NO變數為空白final,我們在物件構造期間初始化此值,如下所示:
class StudentData{ //Blank final variable final int ROLL_NO; StudentData(int rnum){ //必須建構函式中初始化 ROLL_NO=rnum; } void myMethod(){ System.out.println("Roll no is:"+ROLL_NO); } public static void main(String args[]){ StudentData obj=new StudentData(1234); obj.myMethod(); } } Output: Roll no is:1234
未初始化的靜態final變數
宣告期間未初始化的靜態final變數只能在靜態塊中初始化。例:
class Example{
//static 未初始化final變數
static final int ROLL_NO;
static{
ROLL_NO=1230;
}
public static void main(String args[]){
System.out.println(Example.ROLL_NO);
}
}
Output:
1230
2)final方法
無法覆蓋final方法。
這意味著即使子類雖然呼叫父類的final方法沒有任何問題,但是不能覆蓋它。
例:
class XYZ{
final void demo(){
System.out.println("XYZ Class Method");
}
}
class ABC extends XYZ{
void demo(){
System.out.println("ABC Class Method");
}
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
上面的程式會丟擲一個編譯錯誤,但是我們可以在子類中使用父類final方法而不會出現任何問題。
讓我們來看看這段程式碼:這個程式執行正常,因為我們沒有覆蓋final方法。
這表明final方法是可以繼承下來的,但它們不符合覆蓋的條件。
class XYZ{
final void demo(){
System.out.println("XYZ Class Method");
}
}
class ABC extends XYZ{
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
Output:
XYZ Class Method
3) final class
不能繼承一個final類.
如下示例:
final class XYZ{
}
class ABC extends XYZ{
void demo(){
System.out.println("My Method");
}
public static void main(String args[]){
ABC obj= new ABC();
obj.demo();
}
}
Output:
The type ABC cannot subclass the final class XYZ
要點總結
- 1)建構函式不能被宣告為final。
- 2)本地final變數必須在宣告期間初始化。
- 3)在介面中宣告的所有變數預設為final。
- 4)我們不能改變final變數的值。
- 5)不能覆蓋final方法。
- 6)final類不得繼承。
- 7)如果方法引數被宣告為final,則不能更改這些引數的值。
- 8)在大寫命名final變數是一個好習慣。
- 9)final, finally 和 finalize確定是三個不同的術語。finally用於異常處理,finalize是JVM在呼叫期間呼叫的方法垃圾收集。
原文地址:
https://beginnersbook.com/2014/07/final-keyword-java-final-variable-method-class/