目录
一、密封类
1.定义
使用 关键字sealed 修饰的类,禁止被其他类继承,用于限制类的继承层次,保护核心逻辑不被篡改。
2.核心特点
不可继承:密封类不能作为基类,且子类无法使用:密封类 来语法继承。
可实例化:允许创建对象(除非是密封类的同时还是静态类)。
可密封方法 :在非密封类中,可使用 关键字sealed 修饰重写的方法,防止子类进一步重写该方法。
3.代码示例
// 定义密封类
sealed class MathUtility
{
public int Add(int a, int b) => a + b;
}
//错误示例:无法继承密封类
class AdvancedMath : MathUtility { } // 编译报错
4.注意事项
密封类可以继承其他非密封类,但自身不能被继承。
密封类的方法默认不可重写,除非方法本身是 virtual 或 override(需配合sealed显式密封)。
二、静态类
1.定义
使用 关键字static 修饰的类,无法实例化 ,所有成员(字段、方法、属性)都必须是静态的,常用于工具类或全局功能封装。
2.核心特点
不可实例化:不能使用 new 创建对象,直接通过类名来访问对象(类名.成员名)。
成员均为静态:字段、方法、属性等必须使用 关键字static 修饰。
不可继承:静态类默认是密封的,无法被继承(无需额外添加 sealed 关键字)。
3.代码示例
// 定义静态类
static class StringHelper
{
public static bool IsNullOrEmpty(string str) => string.IsNullOrEmpty(str);
// 静态字段
private static int _callCount = 0;
// 静态方法
public static void IncrementCount() => _callCount++;
}
// 使用静态类
bool result = StringHelper.IsNullOrEmpty("test");
StringHelper.IncrementCount();
4.注意事项
静态类不能包含实例构造函数,但可以有静态构造函数(无参数,用于初始化静态成员)。
静态类的成员属于类本身,而非对象,内存中仅存在一份副本。
三、对比分析
|----------|----------------------|---------------------------|
| 对比维度 | 密封类 | 静态类 |
| 实例化 | 允许 | 禁止 |
| 继承性 | 本身不可被继承,但可以继承其他类 | 不可继承,也不可被继承 |
| 成员类型 | 可包含实例成员和静态成员 | 只能包含静态成员 |
| 使用场景 | 限制继承(如工具类、框架核心类) | 封装无状态的工具方法(如Math、Console) |
| 灵活性 | 较高(可实例化、可以继承其他类) | 较低(固定为静态成员) |
四、优缺点总结
1.密封类
优点:
防止滥用继承,保护核心逻辑。
允许实例化,支持面向对象的封装和多态。
缺点:
限制了类的扩展性。
2.静态类
优点:
无需实例化,调用方便(直接类名访问)。
占用内存低(静态成员仅初始化一次)。
缺点:
不可测试:静态方法依赖全局状态,难以模拟和单元测试。
灵活性差:无法实现接口、继承或多态。
五、适用场景
密封类:
框架中的核心类(如String、int等基础类型)。
工具类或辅助类,需防止被继承篡改逻辑。
静态类:
无状态的工具方法(如字符串处理、数学计算)。
建议:
优先使用非密封类,仅在明确需要限制继承时使用密封类。
静态类仅用于纯工具方法,避免包含可变状态(如静态字段)。