JDK17中新的特性之密封類

2022-10-11 17:54:11 字數 1544 閱讀 6231

在jdk17中新增了密封類。密封的類和介面限制了哪些其他類或介面可以拓展或實現它們。密封類這個新的特性在jdk15和jdk16中作為預覽功能。現在在jdk17中作為正式的功能,它與jdk16相比沒有任何變化。

密封類的作用和目標

密封類示例

我門首先定義乙個密封類——shape,這裡定義成了乙個抽象的密封類,也可以不是抽象的。

/**

* 密封類測試

* @author huhailong

* */

public

abstract

sealed

class

shape

permits

circle

,hexagon

,rectangle

上面的sealed關鍵字用來表示這個類是乙個密封類,然後permits表示可以繼承該類的子類,上面有三個,分別是:circlehexagonrectangle。繼承了密封類的子類的修飾符也是有限制的,子類的必須是以下三種型別:

final型別的子類當然是不能拓展的,密封型別的子類和父類類似,可以拓展指定的子類,非密封類則不限制它可以拓展的子類,其實final 在概念上等同於sealed 加上乙個沒有指定任何內容的許可子句,儘管不能編寫這樣的許可子句。下面是shape的三個子類,只有被指定允許繼承的子類可以繼承,其他的類不可以繼承,會報編譯時錯誤。

circle.j**a

/**

* 繼承密封類shape

* @author huhailong

* */

public

non-sealed

class

circle

extends

shape

hexagon.j**a

public

final

class

hexagon

extends

shape

rectangle.j**a

public

sealed

class

rectangle

extends

shape

}

可以看到在shape的子類rectangle也是密封型別,因此我們需要指定拓展它的子類,除了像shape中的那樣通過關鍵字permits來指定外,也可以直接在rectangle內部,也就說密封類允許的子類可以直接寫到密封類的原始檔中,當以這種方式宣告時,密封類可以省略許可子句(permits),j**a編譯器會從原始檔中的宣告推斷出允許的子類。

同樣的,密封介面和密封類的寫法是相似的。詳細的內容可參考官方文件。

JDK1 7的一些新特性

整理了幾條對開發可能用到概率高的 1 swicth支援對string的判斷 以前只能支援int及以下的 switch s 2 泛型的改善 jdk1.7 mapmap new hashmap mapmap new hashmap 3 對try catch多個異常的統一處理 try catch sqle...

JDK1 8中的hashmap和JDK1 7的區別

1.資料插入的方式不同 jdk1.7用的是頭插法,而jdk1.8用的是尾插法,這是由於jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。2.組成結構不同 jdk1.7的時候使...

JDK8中新的日期類學習

1 獲得當前日期 年 月 日 localdate localdate localdate.now system.out.println localdate 返回的是個列舉物件 system.out.println 年 localdate.getyear t月 localdate.getmonth g...