前言----
国庆回家悠闲了七天,没带电脑,今天是军训的第一天(大三才入学军训,没谁了),今晚趁教官去本部看汇演免训一晚上,不过坑还是要补的,就出门奔教室了。欢迎转载,转载请注明来处
1.final用来修饰类,方法
a.修饰类
我们用final修饰类,表明这个类不能被再继承了,一旦某个类打算继承final类时就会报错
final class FuJian{
public FuJian() {
}
}
class FuZhou extends FuJian{
}
很明显,FuZhou这个类要继承FuJian这个final类时就会报错。
b.修饰方法
总所周知,一个子类可以拥有一个和父类的同名方法。但是这样一来,当我们通过子类的引用来调用这个方法时,我们调用到的版本是子类中的版本,也就是说此时该方法的父类版本在子类中已经被覆盖掉了。为了把方法锁定,防止子类去重写它,就可以用final去修饰这个方法。
大家可以看一下,此时printPosition这个方法没有被final修饰,子类FuZhou可以定义自己的printPosition版本。我们把FuJian中的printPosition用final修饰后再继续看下:
这时会提示不能覆盖父类中的final方法。
2.final修饰变量
final最经常用来修饰变量,因此我这边独立抽出来详细讲。
在这个代码中,我把area设置为final变量,把myFuJian设置为final引用,但是我在第10行打算改变area的值,在第12行打算改变
myFuJian这个引用的指向,使之指向新的FuJian对象;但是都报错了,都提示不能改变!
对于一个final变量,如果这个变量是基本的数据类型(int,double 等),则其数值一旦在初始化就不能够修改;如果这个变量是引用类型的变量(也就是自定义的类的引用),那么我们在另其指向另外一个对象后就不应该另其指向另外一个对象(打个比喻:结婚了就不应该爱上其他人了呀)
提问:一个final引用被初始化后,不能再指向其他的对象,如果我严格遵循这点,但是我可以通过这个final引用去修改它初始化对象(哈哈哈哈,也可以理解成从一而终的那个对象)中的值吗?
肯定可以。不论我的这个问题大家是否明白,大家看看下面的代码自然会明白我在说什么了。
第11行尝试让myFuJian这个final引用另指其他对象会出错,但是第13行我通过myFuJian.area = 199999却是可以正常修改area的值,也就是final引用是可以对其指向的对象的内容进行修改的。