• Java的final修饰符


    final 实例域

    可以将实例域定义为 final。对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了。也就是说,必须确保在每一个构造器执行之后,final 实例域的值被设置,并且在后面的操作中,不能够再对 final 实例域进行修改。

    例如,可以将 Employee 类中的 name 域声明为 final,因为在对象构建之后,这个值不会再被修改,即没有 setName() 方法。

    class Employee {
    	private final String name;
        ...
    }
    

    final 修饰符大都应用于基本(primitive)类型域,或不可变(immutable)类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类。例如,String 类就是一个不可变的类)。

    对于可变的类,使用 final 修饰符可能会对读者造成混乱。例如,private final StringBuilder evaluations; 在 Employee 构造器中会初始化为 evaluations = new StringBuilder(); final 关键字只是表示 evaluations 对象变量不会再指向其他的 StringBuilder 对象。不过这个 StringBuilder 对象可以更改。

    public void giveGoldStar() {
    	evaluations.append(LocalDate.now() + ": Gold star!\n");
    }
    

    final 类和方法

    阻止继承:final 类和方法。

    有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类。如果将一个类声明为 final,其中的所有方法自动地成为 final,而不包括数据域(final 类的数据域不会自动地成为 final 域)。

    例如,假设希望阻止人们定义 Executive 类的子类,就可以在定义 Executive 这个类的时候,使用 final 修饰符声明。声明格式如下所示:

    public final class Executive extends Manager {}
    

    类中的特定方法也可以被声明为 final。如果这样做,子类就不能覆盖这个方法例如:

    public class Employee {
       public final String getName() {
           return name;
       } 
    }
    

    将方法或类声明为 final 主要目的是:确保它们不会在子类中改变语义。例如:

    • Calendar 类中的 getTime() 和 setTime() 方法都声明为 final。这表明 Calendar 类的设计者负责实现 Date 类与日历状态之间的转换,而不允许子类处理这些问题。
    • 同样地,String 类也是 final 类,这意味着不允许任何人定义 String 的子类。换言之,如果有一个 String 的引用,它引用的一定是一个 String 对象,而不可能是其他类的对象。

    有些程序员认为:除非有足够的理由使用多态性,应该将所有的方法都声明为 final。事实上,在 C++ 和 C# 中,如果没有特别地说明,所有的方法都不具有多态性。这两种做法可能都有些偏激。我们提倡在设计类层次时,仔细地思考应该将哪些方法和类声明为 final。

    参考资料

    《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.3.9 final 实例域

    《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.7 阻止继承:final 类和方法


    __EOF__

  • 本文作者: 飞鱼
  • 本文链接: https://www.cnblogs.com/feiyu2/p/17349338.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    如何在快应用中定义一个全局对象
    PT_中心极限定理CLT:棣莫佛-拉普拉斯定理de Moivre - Laplace CLT+林德伯格-列维(Lindeberg-Levy)定理
    【react hook】react hook组件中,在forEach中使用async/awati进行异步操作,为什么后面代码没有等待直接同步运行了呢?
    深度好文 | 千万小心,未来10年,这样的检测机构将锐减90%
    手机SSL证书失效了怎么解决?
    newstarctf2022week2
    docker学习1
    Spring中的JdbcTemplate的使用
    JavaScript高级知识-ES5~6
    Python初级笔记6 函数
  • 原文地址:https://www.cnblogs.com/feiyu2/p/17349338.html