jdk17新特性—— 密封类(Sealed Classes)

目录

    • [一、密封类(Sealed Classes)的概述](#一、密封类(Sealed Classes)的概述)
    • [二、密封类(Sealed Classes)代码示例](#二、密封类(Sealed Classes)代码示例)
      • [2.1、密封类(Sealed Classes)代码结构示例](#2.1、密封类(Sealed Classes)代码结构示例)
      • [2.2、密封类(Sealed Classes)代码示例](#2.2、密封类(Sealed Classes)代码示例)
    • [三、密封类(Sealed Classes)接口代码示例](#三、密封类(Sealed Classes)接口代码示例)
      • [3.1、密封类(Sealed Classes)接口代码结构示例](#3.1、密封类(Sealed Classes)接口代码结构示例)
      • [3.2、密封类(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指定的子类或接口来继承或实现。

    java 复制代码
    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表示这个子类不能再被继承了。

    java 复制代码
    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表示这个子类没有密封限制,随便继承

    java 复制代码
    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指定的子类或接口来继承或实现。

    java 复制代码
    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表示这个子类没有密封限制,随便继承

    java 复制代码
    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表示这个子类不能再被继承了。

    java 复制代码
    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指定的子类或接口来继承或实现。

    java 复制代码
    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表示这个子类不能再被继承了。

    java 复制代码
    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表示这个子类没有密封限制,随便继承

    java 复制代码
    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指定的子类或接口来继承或实现。

    java 复制代码
    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表示这个子类没有密封限制,随便继承

    java 复制代码
    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表示这个子类不能再被继承了。

    java 复制代码
    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;
        }
    }
相关推荐
架构师专栏10 个月前
Java 7 - Java 21 新特性
java·jdk8新特性·jdk21新特性·jdk17新特性