目录
- 一、密封类(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{ @Override public 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{ @Override public 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{ @Override public 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{ @Override public 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{ @Override public 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{ @Override public 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{ @Override public String eat() { return null; } }