JavaRush /Java Blog /Random-TW /最終 Java 方法和類別
articles
等級 15

最終 Java 方法和類別

在 Random-TW 群組發布
透過用修飾符表示類別方法final,我們的意思是沒有衍生類別能夠透過更改其內部實作來重寫該方法。換句話說,我們正在談論該方法的最終版本。整個類別也可以標記為final最終 Java 方法和類別 - 1
final class NoExtending {
// …
}
final標記為不可繼承的 類,其所有方法都間接取得該屬性final。在類別和方法的聲明中使用該功能final可以提高程式碼安全性等級。如果一個類別配備了修飾符final,則沒有人可以擴展該類,並且可能會在此過程中破壞其契約。如果一個符號final表示一個方法,那麼您可以在所有情況下完全信任其內部實現,而不必擔心「偽造」。final例如,在需要驗證使用者輸入的密碼的方法的聲明中,可以適當地使用,以確保準確執行該方法最初的意圖。可能的攻擊者將無法透過將其重寫版本「滑入」程序來更改此類方法的原始實現,該版本始終返回 true 值,表明用戶註冊成功,無論密碼是什麼他真的進去了。如果具體情況允許,你有權利更進一步,將final整個類別聲明為一個類別;此方法ValidatePassword將間接取得相同的屬性。在方法或類別聲明中使用修飾符final會嚴重限製程式碼進一步使用和開發的可能性。在聲明中使用final方法可以明確表明該方法實作是獨立的且完全完整的。其他想要使用您的類別、擴展其功能以滿足自己的需求的程式設計師將在實現其目標的手段選擇上受到限製或完全被剝奪。透過將final一個類別標記為一個整體,您將禁用它的繼承能力,並且可能會顯著降低它對其他人的有用性。當您準備好使用修飾符時final,請確保您是否準備好做出此類犧牲以及是否值得這些犧牲。在許多情況下,為了實現足夠級別的程式碼安全性,沒有必要將整個類別指定為- 通過使用修飾符僅final標記其“關鍵”結構元素,很有可能保留類別的可擴展性。final在這種情況下,您將保持類別的主要功能不變,同時允許透過新增成員來繼承它,但無需重新定義「舊」成員。當然,方法程式碼存取的欄位final必須依序指定為final任一private,否則任何衍生類別都將能夠更改其內容,從而影響相應方法的行為。使用修飾符的另一個效果final與簡化編譯器解決的程式碼最佳化問題有關。這是當呼叫未標記為的方法時會發生的情況final,運行時系統確定物件的實際類,將呼叫與重載方法組中最合適的程式碼相關聯,並將控制權轉移給該程式碼。但是,例如,如果前面討論的getName類別範例中的方法Attr被指定為final,則呼叫它的操作可能會明顯簡化。在最簡單的情況下,例如有關 的情況getName,編譯器可以簡單地將方法呼叫替換為其主體程式碼。這種機制稱為程式碼內聯。當使用此方法的內聯版本時,getName以下兩個表達式的執行完全相同:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
雖然上面的表達式是等價的,但是第二種仍然有優勢,因為該方法getName允許你給name字段一個只讀屬性,並且類代碼有一定程度的抽象,這可以讓你更自由地改變類的實現。編譯器可以將相同的最佳化方案應用於 和private方法statiс,因為它們也不允許重寫。在類別聲明中使用修飾符final還可以提高某些類型檢查操作的效率。在這種情況下,許多此類操作可以在編譯階段執行,因此可以更早地檢測到潛在錯誤。如果編譯器在原始文字中遇到對類別的引用final,則可以「確定」對應的物件屬於指定的類型。編譯器能夠立即確定一個類別在整個類別層次結構中佔據的位置,並檢查它是否被正確使用。如果不應用修飾符final,則僅在程式執行階段進行相應的檢查。 練習3.4。是否建議在車輛和乘客車輛類別的方法聲明中包含最終修飾符(如果是,是哪些)?原始來源連結:http://src-code.net/metody-i-klassy-final-java
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION