🌰 3.final修饰静态变量
说到变量肯定不能少了静态变量,修饰静态变量我们通常把static和final搭配使用,像这样的格式:
final static double PAI_Value=3.14;
有的人问这样搭配有什么好处吗?我们结合static和final的特点就知道了,静态变量不需要对象就可以使用,而且可以被全局调用,当再加上final后,它就变成了一个全局的常量。我再任何地方调用PAI_Value都像是调用了一个3.14一样。写成前者代码当然更好看美观一点,这种书写格式在我们观看各种方法的源码时可以经常见到。而且这样书写也有一定的规范,要用大写字母开头中间进行下划线连接。
🌰 3.final变量指向对象
前面的变量指向的都是基本数据类型,接下来我们来看看当final变量指向对象时有什么不一样呢?
我们同样发现当我们第二次给被final修饰的变量student1赋值另外一个Student实例对象时,它报错了(这里举例的是局部变量的例子)
同样从内存角度分析:当我们student1指向一个实例对象后,是不被允许指向另外一个。那我们可以改变李四或者1的值吗?这就讲到前文讲到的修改地址里的内容,我们来尝试一下
public static void main(String[] args) { final Student student1; student1 = new Student("李四", 1); student1.name="王五"; student1.id=2; System.out.println(student1); } }
🎃 :我们发现我们是可以对final变量指向的地址的内容进行更改的,不能更改的是final变量保存的地址。
🌰 3.final和String的不可变性区别
🌼 :final的不可变性我们知道是变量的指向不可变,指向的内容可以变。而String则相反,是指向可以变,但是指向的内容不可变。
就像这个图,如果我们有一个String a="hello",我们再写a="wrold"时,它不会把原来的hello改成wrold,而是改变a的指向指向另外一个字符串wrold,原来的hello是不可以被修改的。由此我们可知如果String对象被final修饰,那它就两者都不能修改啦。
🌲2.final修饰类
final修饰类的情况比较少见结论也比较简单,就直接给大家结论记住:
🔑:1.final修饰的类不可以被继承
2.final不能修饰抽象类(抽象类是要被继承的,当然不能final修饰它啦)
3.被final修饰的类一般是为了不让别人改变它,例如String
🌲3.final修饰方法
同样先给出结论:
🔑:1.final修饰方法,则方法不能被重写。
2.final修饰的方法可以被重载(一定要把重写和重载分清)
3.我们使用final修饰方法,一般是为了给方法“上锁”,我们不希望父类被子类继承后,某个方法被子类覆盖或者改写,我们可以给方法加上final
🌲3.小剧场解答及final总结
现在我们可以很清楚地明白小剧场的答案应该选B。ACD都是都是正确,B错的原因是,我们只要在使用final前对它赋值即可,并不是只能在类方法中(也就是静态方法,照它的意思岂不是静态方法才能final修饰变量?荒谬!)。final虽然我们自己写代码很少用到,但它也是Java的基础关键字,它在各种源码中非常常见,我们应该掌握和了解它