Java中密封类的介绍

简介: Java中密封类的介绍

大家好,我是小面。今天将给大家介绍一下Java中的密封类。

Sealed类是Java武器库中的一个新引入(JDK17)。由于这一添加,在Java编程语言中的关键字集合中添加了另一个关键字。事实上,引入了几个新的关键字来支持密封类:密封和非密封。

这些类扩充了继承的经典概念,在继承概念中,只有一组特定的子类才能扩展父类。因此,本质上,Final类不允许继承。同时,非final类可以由任何子类继承。Sealed类介于两者之间,只指定允许继承的一些类。本编程教程通过代码示例和用例介绍了Java中Sealed类的用法和概念。

什么是Java中的继承?

作为一个补充,继承是一种面向对象的特性,其中继承的类扩展了其父类的特性或功能。这增强了可重用性。子类继承父类的质量(字段、方法和嵌套类),并可以通过多态性和函数重载添加自己的质量。与其他支持多重继承的面向对象编程语言不同,Java严格支持单一继承。一个子类只能扩展一个父类(父类和子类之间的父子关系)。下面是Java中的继承示例:

class Bird {
    String greet;
    Bird(){
        greet="?!";
    }
    void saySomething(){        
        System.out.println(greet);        
    }
}
class Duck extends Bird{
    Duck(){
        greet="Quack, Quack";
    }
    void saySomething(){
        System.out.println(greet);
    }
}

然而,请注意,当开发人员使用接口时,没有这种限制。Java允许类实现多个接口,如以下示例代码所示:

class Bird {
    String greet;
    Bird(){
        greet="?!";
    }
    void saySomething(){        
        System.out.println(greet);        
    }
}
interface CanFly{
    default void shoo() {
        System.out.println("fly...");
    }
}
interface CannotFly{
    default void shoo() {
        System.out.println("run...");
    }
}
class Ostrich extends Bird implements CannotFly{
    Ostrich(){
        greet="boom";
    }
    void saySomething(){
        System.out.println(greet);
        shoo();
    }
}

什么是Java的final类?

如果程序员想要限制类的继承或使其绝对不可继承,我们可以简单地以最后一个关键字开始类定义。此关键字的目的是防止类被子类化。因此,类变得不可修改和不可扩展。下面是一些示例代码,演示如何在Java中使用final关键字:

final class A {
    void func(){
        System.out.println("final class");
    }
}
class B extends A {} // 这里是不允许继承的

Java中的抽象类是什么?

如果开发人员希望确保在不扩展类的情况下无法创建任何对象,我们可以使用关键字abstract声明一个类。尽管抽象可以具有常规类的所有特性,但使用abstract关键字使其变得特别。为了创建这个类的对象,程序员需要用一个非抽象类来扩展它,只有这样我们才能创建它的实例。从这个意义上讲,接口实际上像Java中的纯抽象类。下面是一个示例:

abstract class Shape{
    void show(){
        System.out.print("Shape");
    }
}
class Box extends Shape{}
//...
Shape s = new Shape(); // 这个会报错! 不能创建对象
Shape s = new Box(); // 这样是可以的

Java中的密封类是什么?

正如您所看到的,在引入Sealed类之前,继承在Java中是一种要么全有要么全无的事情。并没有中间的规定,这意味着——如果我们希望允许某些类继承其他类无法继承的限制,该怎么办。这种类型的限制性或选择性继承在Sealed类中是可能的。它实际上由两个极端类组成:Final类和Abstract类,前者完全阻止继承,后者强制继承。Sealed类使开发人员能够精确地指定允许哪些子类扩展超级类。

因为有密封类,所以也有密封接口。两者都能更好地控制继承。这在设计类库时特别有用。

程序员可以用关键字Sealed声明一个Sealed类。然后我们提供类名并使用permit子句指定允许的子类。注意,关键字sealed和permissions都是上下文敏感的,并且与类或接口声明相关具有特殊含义;在Java中,它们除了此之外没有任何意义。

Java中的密封类声明如下:

public sealed class A permits B, C {
 //...
}

在这个代码示例中,类A可由类B和C继承——或允许继承;没有其他类可以继承它。

public final class B extends A { }
public final class C extends A { }
public final class D extends A { } // 这里会报错! D 不能继承 A

注意,允许的类被声明为final。这意味着允许的子类不能进一步继承。然而,除了final关键字之外,我们可以使用其他子句,例如非密封的或与子类密封的。换句话说,密封类的子类必须声明为final、sealed或非sealed。

现在,如果我们希望类B可以由类D进一步扩展,我们可以如下声明D:

public sealed class B extends A permits D {}
public final class D extends B {} // 喏,现在可以继承了

现在,假设我们希望类A由B和C扩展,我们也希望类D扩展类B,但我们不希望类D声明为final、非密封或密封,那么我们可以按如下方式设计类:

Public sealed class A permits B,C{}
public non-sealed class B extends A { }
public class D extends A { } // OK

密封类的一些关键要求包括:

  • 允许的子类必须可由Sealed类访问。
  • 密封类和子类必须位于同一个命名模块中,尽管它们可以位于不同的包中。
  • 对于未命名的模块,密封类和子类必须在同一个包中。

Java中的密封接口

密封接口的声明方式与密封类几乎相同。这里,permit子句用于指定允许哪个类或接口实现或扩展Sealed接口。例如,我们可以如下声明一个Sealed接口(这里,Sealed接口允许a类和B类实现):

public sealed interface SealedInterface permits A, B {}

A class that implements a Sealed interface must be declared as final, sealed, or non-sealed:

public non-sealed class A implements SealedInterface{}
public final class B implements SealedInterface{}

如果接口扩展了密封接口,则必须将其声明为密封或非密封。例如:

public non-sealed interface AI extends SealedInterface{}

关于Java中密封类的最后思考

Java中Sealed类和接口的引入为Java编程语言的继承特性注入了一些灵活性。尽管它们可能在特殊情况下使用,但密封类可能在API库的类设计中。重点是语言中提供了灵活性;程序员可以根据程序的要求使用它们。这个特性最好的一点是它在继承的使用上带来了某种形式的灵活性,在这种情况下,必须在完全限制继承的Final类之间缩小,或者在必须完全继承的抽象类之间缩小。

今天的分享就到此结束,如果觉得本文不错的还请伙伴们帮忙点赞转发,欢迎持续关注我们!

相关文章
|
3天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
30 19
|
4天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
36 11
|
9天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
9天前
|
存储 Java 编译器
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
10天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
34 5
|
9天前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
1月前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box<T>`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box<T>` 编译后变为 `Box<Object>`,从而实现无缝交互和减少内存开销。
|
3月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
4月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
132 8

热门文章

最新文章