Discuss / Java / Java 中的 sealed 是什么?用代码举例

Java 中的 sealed 是什么?用代码举例

Topic source

🌙

#1 Created at ... [Delete] [Delete and Lock User]
在 Java 15 中引入了 sealed 关键字来限制类的继承,sealed classes 可以控制它们的子类的数量以及哪些类可以成为其子类。

举个例子,我们有一个抽象类 Animal,它有两个实现类 Dog 和 Cat,现在我们希望只允许有一个特殊的类 Alien 继承 Animal,这时就可以使用 sealed。

示例代码如下:

```java
public abstract sealed class Animal permits Dog, Cat {
    // Animal code
}

public final class Alien extends Animal {
    // Alien code
}

public final class Dog extends Animal {
    // Dog code
}

public final class Cat extends Animal {
    // Cat code
}
```

在这个例子中,abstract sealed class Animal 声明了 Animal 类是一个 sealed class,允许 permits 关键字后的 Dog 和 Cat 作为 Animal 的允许的子类。而 final class Alien 则是 Animal 的一个允许的子类。

这样,除 Alien 外的其它类都无法继承 Animal,保证了 Animal 类的稳定性。

🌙

#2 Created at ... [Delete] [Delete and Lock User]

怎么感觉有问题,还不如上一个

🌙

#3 Created at ... [Delete] [Delete and Lock User]
在 Java 15 中,sealed 是一个新的关键字,用于限制哪些类可以继承或实现一个特定的类或接口。一个 sealed 类或接口明确声明它允许什么样的子类存在,然后使用 sealed 关键字来规定这些子类必须显式地继承该类或接口。

以下是一个使用 sealed 的例子:

```
public abstract sealed class Shape permits Circle, Square, Triangle {
    // ...
}

public final class Circle extends Shape {
    // ...
}

public final class Square extends Shape {
    // ...
}

public final class Triangle extends Shape {
    // ...
}
```

在这个例子中,Shape 是一个抽象 sealed 类,明确说明只有 Circle、Square 和 Triangle 这三个继承类可以存在。这三个子类都必须显式地继承 Shape 类。如果有其他类试图继承 Shape 类,就会在编译时出错。

🌙

#4 Created at ... [Delete] [Delete and Lock User]

第一个应该是有问题的,可能和我用的盗版的chatgpt有关系

🌙

#5 Created at ... [Delete] [Delete and Lock User]

在Java中,sealed是一个关键字,用于限制类的继承结构。使用sealed关键字修饰的类具有两个特点:

  1. 只有相同模块内的类可以继承该类;
  2. 子类必须在声明时使用permits关键字指定允许继承的子类,而非继承关键字extends

下面是一个代码示例:

public sealed class Animal permits Dog, Cat {
    // ...
}

public final class Dog extends Animal {
    // ...
}

public final class Cat extends Animal {
    // ...
}

public class Tiger extends Animal {
    // Error: Tiger is not permitted to extend Animal
}

在上面的示例中,Animal类被sealed关键字修饰,而DogCat类使用了permits关键字指明它们是允许继承Animal类的。而Tiger类没有被允许继承Animal类,所以会出现编译错误。

🌙

#6 Created at ... [Delete] [Delete and Lock User]

还是老师这个右下角的靠谱一点


  • 1

Reply