final 的套路:
当初在背面试题的时候final出现的概率可以说是相当高了,在各种面试题库中都少不了它的身影,一说起final ,那打开方式差不多就是这样的:
1. 对于基本类型变量:final 修饰的变量不可修改
2. 对于引用型变量: final 修饰的对象,引用本身不可修改,但是被引用的内容可以修改。
3. 对于 方法 : 方法不能重写
4. 对于类:类不能被继承
因为当时看了太多遍同时内容简单又好背,现在不看书也能写出来了,至于具体的代码示例这里就不放了,网上也比较多。
但是自己从来没有想过为什么。
为什么不让类被继承?为什么不让人家重写方法?
反向思考
关于这个问题我觉得反向来思考是最有效的,那就是如果我继承了又怎么样,我重写了又会如何。
最后发现如果继承或重写了我们可能就有很大的麻烦,还是不要继承,也不要重写了吧,然后我们就在类和方法上加上了final。
而关于final与不可变性,可以从变量,方法,类三个角度来思考。
变量与final
大家初学时都会碰到的Math类,而Math类中有着许多的static变量,是可以共享的,如耳熟能详的PI,同时它也被设计成了final 的。
假设我们现在正在开发一个计算各种图形参数的程序,你负责开发Circle(sphere)的部分,另外一个人(就叫背锅侠吧,名字揭示了命运。。。)负责开发sphere(球体),很明显,你们的各种计算过程中都会涉及到PI这个变量。
假如PI没有加final
有一天你觉得这个PI怎么看起来这么长啊,真是不爽,你的运算结果只需要保留两位小数就行了,但我却需要拿一个这么多小数位的变量,于是你决定在自己的类初始化的时候修改这个变量的值,让它只有两位小数。而你不知道的是,负责开发球体的那个伙计他的计算结果要保留到小数点后4位。
悲剧到这里已经很明显了:你们自己测试的时候都没什么问题,而用户在使用程序计算完一个圆的各种参数后,再计算其他涉及到PI变量的程序都没办法得到想要的结果,比如计算球