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

目录

    • 一、密封类(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)代码结构
    jdk17新特性—— 密封类(Sealed Classes)_第1张图片

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)接口代码结构
    jdk17新特性—— 密封类(Sealed Classes)_第2张图片

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;
        }
    }
    

你可能感兴趣的:(jdk17新特性,jdk17新特性)