目录
- 一、密封类(Sealed Classes)的概述
- 1.1、概述
- 1.2、特性
- 1.3、注意事项
- 二、密封类(Sealed Classes)代码示例
- 2.1、密封类(Sealed Classes)代码结构示例
- 2.2、密封类(Sealed Classes)代码示例
- 三、密封类(Sealed Classes)接口代码示例
- 3.1、密封类(Sealed Classes)接口代码结构示例
- 3.2、密封类(Sealed Classes)接口代码示例
一、密封类(Sealed Classes)的概述
1.1、概述
- 密封类和接口 限制哪些其他类或接口可以扩展或实现它们。
1.2、特性
- JDK15的JEP 360: Sealed Classes (Preview)中作为预览版引入;
- JDK16的JEP 397: Sealed ClassesSecond Preview)中第二轮预览;
- JDK17的JEP 409: Sealed Classes中正式转正。
1.3、注意事项
- permits指定的子类必须与父类在同一个显式命名的module下;
- permits指定的子类必须直接继承父类;
- permits指定的子类必须声明自己的密封类型;
- final表示这个子类不能再被继承了;
- non-sealed表示这个子类没有密封限制,随便继承。
二、密封类(Sealed Classes)代码示例
2.1、密封类(Sealed Classes)代码结构示例
- 密封类(Sealed Classes)代码结构
2.2、密封类(Sealed Classes)代码示例
一个类可以用sealed修饰,表示这个类只能由permits指定的子类或接口来继承或实现。
-
抽象类Animal 由sealed修饰,只能由permits指定的子类或接口来继承或实现。
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 19:41* @Description: 动物类* 一个类或接口可以用sealed修饰,表示这个类或接口只能由permits子句指定的子类或接口来继承或实现。*/ public abstract sealed class Animal permits Dog,Cat,Pig{public abstract String eat(); }
-
抽象类Animal 由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。final表示这个子类不能再被继承了。
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 19:47* @Description: 抽象类Animal被sealed修饰,说明它的子类会受到限制,只能是permits子句中生命的子类的其中一个。这些子类如下**/ public final class Cat extends Animal{@Overridepublic String eat() {return "鱼";} }
-
抽象类Animal 由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。non-sealed表示这个子类没有密封限制,随便继承
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 19:52* @Description: 抽象类Animal被sealed修饰,说明它的子类会受到限制,只能是permits子句中生命的子类的其中一个。这些子类如下*/ public non-sealed class Dog extends Animal{@Overridepublic String eat() {return "骨头";} }
-
类Pig由sealed修饰,只能由permits指定的子类或接口来继承或实现。
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 19:59* @Description: 抽象类Animal被sealed修饰,说明它的子类会受到限制,只能是permits子句中生命的子类的其中一个。这些子类如下*/ public sealed class Pig extends Animal permits White,Black{@Overridepublic String eat() {return "饲料";} }
-
类Pig由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。non-sealed表示这个子类没有密封限制,随便继承
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 20:03* @Description:*/ public non-sealed class White extends Pig{ }
-
类Pig 由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。final表示这个子类不能再被继承了。
package com.xz.jdk17.day2; /*** @Author: xz* @Date: 2024-01-31 20:09* @Description:*/ public final class Black extends Pig{}
三、密封类(Sealed Classes)接口代码示例
3.1、密封类(Sealed Classes)接口代码结构示例
- 密封类(Sealed Classes)接口代码结构
3.2、密封类(Sealed Classes)接口代码示例
一个接口可以用sealed修饰,表示这个接口只能由permits指定的子类或接口来继承或实现。
-
接口Animal 由sealed修饰,只能由permits指定的子类或接口来继承或实现。
package com.xz.jdk17.day3;/*** @Author: xz* @Date: 2024-01-31 20:11* @Description:*/ public sealed interface Animal permits Cat,Dog,Pig{String eat(); }
-
接口Animal由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。final表示这个子类不能再被继承了。
package com.xz.jdk17.day3; /*** @Author: xz* @Date: 2024-01-31 20:15* @Description:*/ public final class Dog implements Animal{@Overridepublic String eat() {return "骨头";} }
-
接口Animal由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。non-sealed表示这个子类没有密封限制,随便继承
package com.xz.jdk17.day3; /*** @Author: xz* @Date: 2024-01-31 20:18* @Description:*/ public non-sealed class Cat implements Animal{@Overridepublic String eat() {return "鱼";} }
-
接口Pig由sealed修饰,只能由permits指定的子类或接口来继承或实现。
package com.xz.jdk17.day3; /*** @Author: xz* @Date: 2024-01-31 20:21* @Description: 注意接口可以被实现,也可以被继承。*/ public sealed interface Pig extends Animal permits Black,White {String eat(); }
-
接口Pig由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。non-sealed表示这个子类没有密封限制,随便继承
package com.xz.jdk17.day3; /*** @Author: xz* @Date: 2024-01-31 20:24* @Description:*/ public non-sealed class White implements Pig{@Overridepublic String eat() {return null;} }
-
接口Pig 由sealed修饰,说明它的子类会受到限制,只能是permits子句中的子类的其中一个。final表示这个子类不能再被继承了。
package com.xz.jdk17.day3; /*** @Author: xz* @Date: 2024-01-31 20:27* @Description:*/ public final class Black implements Pig{@Overridepublic String eat() {return null;} }