JAVA - 密封类

除非一个类声明为final,否则任何人都可以派生这个类的子类。但是如果想对它有更多控制权那?指定它的具体子类,阻止被人派生父类的子类。 在Java中 ,密封类(sealed class) 会控制哪些类可以继承它。Java15中作为一个预览特性增加了密封类,并在Java17中确定了这个特性

案例:

package com.demo;

//指定只有B,C 类可以继承A
public  sealed class A  permits B,C {
}

如果类D 去继承 类A则编译不会通过:

同时类A也会有编译错误:

一个密封类允许的子类必须是可访问的。它们不能是嵌套在另一个类中的私有类,也不能是位于另外一个包中的包可见的类。对于允许的公共子类,规则更为严格。它们必须与密封类在同一个包中。不过,如果使用模块,则必须在同一个模块中

如下,位于com.demo包中的类A虽然允许D继承,但是D位于com.demo2中,编译不会通过

密封类的子类必须指定它是sealed、final、还是允许继续派生子类。对于最后一种情况,必须声明为no-sealed

no-sealed 类:

声明密封类可以不加permits 子句。这样一来,它的所有直接子类都必须在同一个文件中声明。不能访问这个文件的程序员就不能派生它的子类

package com.demo2;

public sealed class A {
}

final  class  B extends  A {

}

final  class  C extends  A {

}
posted @ 2023-10-15 11:22  chuangzhou  阅读(24)  评论(0编辑  收藏  举报