国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java java教程 Java 密封類

Java 密封類

Oct 29, 2024 am 01:37 AM

Sealed Classes en Java

密封類是之前在 JDK 15 中引入并在 JDK 17 中正式引入的功能。 密封類 是一個(gè)不能由未明確允許的類(在類聲明中)擴(kuò)展,因此子類的數(shù)量是有限的并且可以提前知道。

它們的目的是允許更精確地控制繼承層次結(jié)構(gòu),并促進(jìn)所有可能的子類已知的域的建模,并提高代碼的安全性和可維護(hù)性。

密封類和最終類型的類之間的區(qū)別在于,后者不能被任何類擴(kuò)展,而密封類可以擴(kuò)展有限數(shù)量的類課程。

密封類聲明

假設(shè)我們有兩個(gè)類,一個(gè) Shape 類和一個(gè) Circle 類,它們都是普通類,所以 Shape 可以被任何類擴(kuò)展。

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

如果我們?cè)赟hape類中使用final關(guān)鍵字,那么它就不能被任何類擴(kuò)展。

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

現(xiàn)在,如果我們希望 Shape 類僅由某些類(例如 Circle 和 Square)擴(kuò)展,那么我們可以將其聲明為 密封類。

public sealed class Shape permits Circle, Square {
    // ...
}

分析前面的聲明,我們發(fā)現(xiàn)需要在單詞class之前放置sealed,以表明它是一個(gè)密封類。然后,使用“permits”一詞,后面跟著可以擴(kuò)展當(dāng)前類的類列表,在上面的示例中,只有 Circle 和 Square 類可以擴(kuò)展 Shape 類。

如果您使用抽象類型的類,即無(wú)法實(shí)例化但可以由其他類擴(kuò)展的類,也會(huì)發(fā)生同樣的情況。

public sealed abstract class Shape permits Circle, Square {
    // ...
}

這個(gè)概念也可以應(yīng)用于接口。

public sealed interface Shape permits Circle, Square {
    // ...
}

注意:允許的子類必須與sealed類位于同一模塊或包中,否則將顯示錯(cuò)誤消息。

允許的課程

一旦將類聲明為 seal 并指定了允許的類,當(dāng)使用允許的類擴(kuò)展 Shape 類(通過(guò)放置 extends Shape)時(shí),IDE 將顯示類似于此的錯(cuò)誤消息 Modifier 'sealed' ,‘未密封’或‘最終’預(yù)計(jì),這是什么意思?.

必須考慮到每個(gè)允許的類(子類)都必須使用以下關(guān)鍵字之一進(jìn)行聲明:

  • Final:表示該類不能擴(kuò)展。
  • Sealed:表示該類是密封類并且它允許子類。
  • 非密封:表示該類不是密封類并且可以由任何類擴(kuò)展。

為了將上述內(nèi)容付諸實(shí)踐,讓我們使用 Shape 類以及 Circle、Square 和 Triangle 類來(lái)看看如何根據(jù)上面提到的內(nèi)容來(lái)聲明允許的類。

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

圓班-決賽

如果我們希望 Circle 類是最終類型并且因此不能擴(kuò)展,那么它必須聲明如下:

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

這可以防止 Circle 類被任何其他類擴(kuò)展。

方形類-密封

如果我們希望 Square 類是密封類型并且允許子類可以擴(kuò)展它,那么它必須聲明如下:

public sealed class Shape permits Circle, Square {
    // ...
}

對(duì)于此示例,每個(gè)允許的類(SquareChild1 和 SquareChild2)都聲明為 Final 類型,以便它們不能由任何其他類擴(kuò)展。

public sealed abstract class Shape permits Circle, Square {
    // ...
}

如果您希望這些類能夠擴(kuò)展更多的類,那么應(yīng)該將它們聲明為密封的,或者它們可以由任何非密封的類擴(kuò)展。

三角類-非密封

對(duì)于 Triangle 類,當(dāng)它被聲明為非密封時(shí),它允許任何其他類擴(kuò)展該類,而無(wú)需指定允許的類。

public sealed interface Shape permits Circle, Square {
    // ...
}

例如,如果您創(chuàng)建擴(kuò)展 Triangle 的 TriangleChild 類,則不會(huì)顯示錯(cuò)誤消息。

public sealed class Shape permits Circle, Square, Triangle {
    // ...
}

此時(shí),重要的是要考慮到,如果您將一個(gè)類聲明為非密封類,那么您會(huì)以某種方式 “破壞” 密封類 的目的,因?yàn)樗试S此類由任何其他類擴(kuò)展,并且允許的子類數(shù)量不受限制。

記錄可以是密封類嗎?

就其本身而言,記錄不能是密封類型,因?yàn)樗呀?jīng)是最終類型并且不能由任何其他類擴(kuò)展。但是您可以做的是在密封類型的 interface 中聲明一個(gè) record (考慮到記錄不能擴(kuò)展類,只能實(shí)現(xiàn)接口)。例如,如果您有一個(gè)名為 Rectangle 的記錄和一個(gè) seal 類型的 Shape 接口,您可以在 Shape 接口中聲明 Rectangle ,這樣 Rectangle 就能夠?qū)崿F(xiàn) Shape 接口以及該接口包含的所有方法。

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

那么內(nèi)部類呢?

如果聲明為密封的類具有內(nèi)部類(嵌套或內(nèi)部類),則假定這些類屬于主類,因此無(wú)需將它們聲明為允許的。例如,如果您將 Animal 類聲明為 seal,同時(shí)將 Dog 和 Cat 作為內(nèi)部類,則這些類不需要聲明為 allowed,但它們必須擴(kuò)展主類并為最終類型,密封或非密封。

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

結(jié)論

密封類是一種將類層次結(jié)構(gòu)限制為有限數(shù)量的允許子類的方法,盡管我們已經(jīng)看到,如果一個(gè)類被聲明為非密封,那么目的就有點(diǎn)丟失了,或者通過(guò)聲明一個(gè)作為密封子類,您可以進(jìn)一步擴(kuò)展此層次結(jié)構(gòu)。

需要考慮的是,在聲明一個(gè)類為sealed時(shí),這只指誰(shuí)可以擴(kuò)展它,而不會(huì)限制主類實(shí)例的創(chuàng)建,也不會(huì)修改該類的語(yǔ)義,即它不會(huì)修改類的內(nèi)部行為。

以上是Java 密封類的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

hashmap和hashtable之間的區(qū)別? hashmap和hashtable之間的區(qū)別? Jun 24, 2025 pm 09:41 PM

HashMap與Hashtable的區(qū)別主要體現(xiàn)在線程安全、null值支持及性能方面。1.線程安全方面,Hashtable是線程安全的,其方法大多為同步方法,而HashMap不做同步處理,非線程安全;2.null值支持上,HashMap允許一個(gè)null鍵和多個(gè)null值,Hashtable則不允許null鍵或值,否則拋出NullPointerException;3.性能方面,HashMap因無(wú)同步機(jī)制效率更高,Hashtable因每次操作加鎖性能較低,推薦使用ConcurrentHashMap替

為什么我們需要包裝紙課? 為什么我們需要包裝紙課? Jun 28, 2025 am 01:01 AM

Java使用包裝類是因?yàn)榛緮?shù)據(jù)類型無(wú)法直接參與面向?qū)ο蟛僮?,而?shí)際需求中常需對(duì)象形式;1.集合類只能存儲(chǔ)對(duì)象,如List利用自動(dòng)裝箱存儲(chǔ)數(shù)值;2.泛型不支持基本類型,必須使用包裝類作為類型參數(shù);3.包裝類可表示null值,用于區(qū)分未設(shè)置或缺失的數(shù)據(jù);4.包裝類提供字符串轉(zhuǎn)換等實(shí)用方法,便于數(shù)據(jù)解析與處理,因此在需要這些特性的場(chǎng)景下,包裝類不可或缺。

JIT編譯器如何優(yōu)化代碼? JIT編譯器如何優(yōu)化代碼? Jun 24, 2025 pm 10:45 PM

JIT編譯器通過(guò)方法內(nèi)聯(lián)、熱點(diǎn)檢測(cè)與編譯、類型推測(cè)與去虛擬化、冗余操作消除四種方式優(yōu)化代碼。1.方法內(nèi)聯(lián)減少調(diào)用開(kāi)銷,將頻繁調(diào)用的小方法直接插入調(diào)用處;2.熱點(diǎn)檢測(cè)識(shí)別高頻執(zhí)行代碼并集中優(yōu)化,節(jié)省資源;3.類型推測(cè)收集運(yùn)行時(shí)類型信息實(shí)現(xiàn)去虛擬化調(diào)用,提升效率;4.冗余操作消除根據(jù)運(yùn)行數(shù)據(jù)刪除無(wú)用計(jì)算和檢查,增強(qiáng)性能。

什么是接口中的靜態(tài)方法? 什么是接口中的靜態(tài)方法? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

什么是實(shí)例初始器塊? 什么是實(shí)例初始器塊? Jun 25, 2025 pm 12:21 PM

實(shí)例初始化塊在Java中用于在創(chuàng)建對(duì)象時(shí)運(yùn)行初始化邏輯,其執(zhí)行先于構(gòu)造函數(shù)。它適用于多個(gè)構(gòu)造函數(shù)共享初始化代碼、復(fù)雜字段初始化或匿名類初始化場(chǎng)景,與靜態(tài)初始化塊不同的是它每次實(shí)例化時(shí)都會(huì)執(zhí)行,而靜態(tài)初始化塊僅在類加載時(shí)運(yùn)行一次。

變量的最終關(guān)鍵字是什么? 變量的最終關(guān)鍵字是什么? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

什么是類型鑄造? 什么是類型鑄造? Jun 24, 2025 pm 11:09 PM

類型轉(zhuǎn)換有兩種:隱式和顯式。1.隱式轉(zhuǎn)換自動(dòng)發(fā)生,如將int轉(zhuǎn)為double;2.顯式轉(zhuǎn)換需手動(dòng)操作,如使用(int)myDouble。需要類型轉(zhuǎn)換的情況包括處理用戶輸入、數(shù)學(xué)運(yùn)算或函數(shù)間傳遞不同類型的值時(shí)。需要注意的問(wèn)題有:浮點(diǎn)數(shù)轉(zhuǎn)整數(shù)會(huì)截?cái)嘈?shù)部分、大類型轉(zhuǎn)小類型可能導(dǎo)致數(shù)據(jù)丟失、某些語(yǔ)言不允許直接轉(zhuǎn)換特定類型。正確理解語(yǔ)言的轉(zhuǎn)換規(guī)則有助于避免錯(cuò)誤。

什么是工廠模式? 什么是工廠模式? Jun 24, 2025 pm 11:29 PM

工廠模式用于封裝對(duì)象創(chuàng)建邏輯,使代碼更靈活、易維護(hù)、松耦合。其核心答案是:通過(guò)集中管理對(duì)象創(chuàng)建邏輯,隱藏實(shí)現(xiàn)細(xì)節(jié),支持多種相關(guān)對(duì)象的創(chuàng)建。具體描述如下:工廠模式將對(duì)象創(chuàng)建交給專門(mén)的工廠類或方法處理,避免直接使用newClass();適用于多類型相關(guān)對(duì)象創(chuàng)建、創(chuàng)建邏輯可能變化、需隱藏實(shí)現(xiàn)細(xì)節(jié)的場(chǎng)景;例如支付處理器中通過(guò)工廠統(tǒng)一創(chuàng)建Stripe、PayPal等實(shí)例;其實(shí)現(xiàn)包括工廠類根據(jù)輸入?yún)?shù)決定返回的對(duì)象,所有對(duì)象實(shí)現(xiàn)共同接口;常見(jiàn)變體有簡(jiǎn)單工廠、工廠方法和抽象工廠,分別適用于不同復(fù)雜度的需求。

See all articles