final 實體域
可以將實體域定義為 final,對于 final 域來說,構建物件時必須初始化 final 實體域,構造物件之后就不允許改變 final 實體域的值了,也就是說,必須確保在每一個構造器執行之后,final 實體域的值被設定,并且在后面的操作中,不能夠再對 final 實體域進行修改,
例如,可以將 Employee 類中的 name 域宣告為 final,因為在物件構建之后,這個值不會再被修改,即沒有 setName() 方法,
class Employee {
private final String name;
...
}
final 修飾符大都應用于基本(primitive)型別域,或不可變(immutable)類的域(如果類中的每個方法都不會改變其物件,這種類就是不可變的類,例如,String 類就是一個不可變的類),
對于可變的類,使用 final 修飾符可能會對讀者造成混亂,例如,private final StringBuilder evaluations; 在 Employee 構造器中會初始化為 evaluations = new StringBuilder(); final 關鍵字只是表示 evaluations 物件變數不會再指向其他的 StringBuilder 物件,不過這個 StringBuilder 物件可以更改,
public void giveGoldStar() {
evaluations.append(LocalDate.now() + ": Gold star!\n");
}
final 類和方法
阻止繼承:final 類和方法,
有時候,可能希望阻止人們利用某個類定義子類,不允許擴展的類被稱為 final 類,如果在定義類的時候使用了 final 修飾符就表明這個類是 final 類,如果將一個類宣告為 final,其中的所有方法自動地成為 final,而不包括資料域(final 類的資料域不會自動地成為 final 域),
例如,假設希望阻止人們定義 Executive 類的子類,就可以在定義 Executive 這個類的時候,使用 final 修飾符宣告,宣告格式如下所示:
public final class Executive extends Manager {}
類中的特定方法也可以被宣告為 final,如果這樣做,子類就不能覆寫這個方法例如:
public class Employee {
public final String getName() {
return name;
}
}
將方法或類宣告為 final 主要目的是:確保它們不會在子類中改變語意,例如:
- Calendar 類中的 getTime() 和 setTime() 方法都宣告為 final,這表明 Calendar 類的設計者負責實作 Date 類與日歷狀態之間的轉換,而不允許子類處理這些問題,
- 同樣地,String 類也是 final 類,這意味著不允許任何人定義 String 的子類,換言之,如果有一個 String 的參考,它參考的一定是一個 String 物件,而不可能是其他類的物件,
有些程式員認為:除非有足夠的理由使用多型性,應該將所有的方法都宣告為 final,事實上,在 C++ 和 C# 中,如果沒有特別地說明,所有的方法都不具有多型性,這兩種做法可能都有些偏激,我們提倡在設計類層次時,仔細地思考應該將哪些方法和類宣告為 final,
參考資料
《Java核心技術卷一:基礎知識》(第10版)第 4 章:物件與類 4.3.9 final 實體域
《Java核心技術卷一:基礎知識》(第10版)第 5 章:繼承 5.1.7 阻止繼承:final 類和方法
本文來自博客園,作者:真正的飛魚,轉載請注明原文鏈接:https://www.cnblogs.com/feiyu2/p/17349338.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551030.html
標籤:Java
上一篇:從原理聊JVM(二):從串行收集器到磁區收集開創者G1
下一篇:返回列表
