哈喽,小伙伴们大家好,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!
这一节啊,咱们要学习的内容是Java所有final关键字。
之前呢,我们学习了继承,这大大提高了代码的灵活性和复用性。但是总有一些时候,我们的类不希望被子类继承,成员属性不希望被子类修改,成员方法不希望被子类重写,那该怎么办呢?
final关键字相当于“最终”或“不可更改”,在生活中,比如学校期末考试的成绩是“最终”的,不可再更改。
同样在java程序中,final关键字也表示最终,用于修饰变量、方法和类,其含义是指不可更改,即所修饰的类不可以被继承,修饰的方法不可以被重写,修饰的变量为常量,值不可以改变。
1.final 修饰类
final 修饰类代表这个class不允许被继承。
注意,class左边的访问修饰符(比如public)和final的位置可以互换。不过,我们一般习惯于讲final写在public后面。
比较典型的,就是String类,它就是final的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { }
为什么呢?
保证String类的安全性,防止被其他类继承,重写String类的方法,破坏String类的语义,导致程序出错。
String类是一个特殊的类,它的内部实现了字符串的指针,可以优化字符串的操作效率,如果被其他类继承,就可能导致内部实现的细节被破坏,影响性能。
总结下来就是,String类用的很频繁,而且已经写的够牛逼了,你就别瞎改啦。
2.final 修饰成员方法
final 修饰成员方法,就是在返回值左边加上final关键字,这样一来这个方法就不能再被子类重写,但是在访问权限足够的情况下依然能够被访问和调用,也可以被子类继承使用。
3.final 修饰方法内的局部变量
public final void sayHello(){ final String name = "keke"; System.out.println("Hello, I am a "+name+"!"); }
final可以修饰方法内的局部变量,被修饰的变量不能再被修改。
PS:final 修饰方法内的局部变量,你必须在这个变量被使用前进行初始化!
其实吧,不仅是final的变量,任何局部变量你不初始化都不能用啊。。。
String aa; System.out.println(aa); //报错
4.final 修饰成员变量
final修饰成员方法,该成员方法就不能被子类重写,但是仍然可以被子类继承并可以通过子类对象调用该方法。
final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败。
如图所示,你不能声明一个final变量却不给他赋值。给final变量赋值你有两种方式,一个是在构造方法中赋值,另一个是在定义的时候就赋值。
从深层次讲,就是你必须得在这个类的对象出现之前就给final变量赋值,因此你不能在set方法中给他赋值,因为你必须先new对象出来才能调用set方法啊。
5.final修饰的局部变量能改属性吗
就是说,在一个方法里,我定义一个局部的引用类型变量,而且还设置了final,那么我们可以修改它的属性值吗?
public static void main(String[] args) { final Student s = new Student(); s.setMoney(200000); System.out.println(s.getMoney()); }
答案是当然可以,final修饰的变量,你不能给他重新赋值,但是没说不能修改其属性啊。
这样就不行咯!
所以,final修饰了这个变量,他的地址就被定死了,不能改了。
顺便说一下,构造方法是不能修饰构造方法的。
6. 课后作业
1、下列关于final关键字的描述,正确的是( )
A. final关键字可用来修饰方法
B. final关键字可用来修饰类
C. 声明为final的方法不能被重写
D. final修饰的方法可以被private修饰符修饰