本节介绍final关键字的基本使用以及使用它的目的一般是什么
什么是final关键字?
final关键字和static一样是一种状态修饰符.
被final修饰的东西不能够被改变这就是final关键字的作用
final关键字怎么用?
final关键字使用和static一样,写在权限修饰符的后面,
即public final …
final可以修饰类,方法,和变量,参数
修饰不同的东西表示的作用不一样
–>但是不能修饰抽象方法.因为抽象方法是要被子类改变的和final意思相反
看以下代码认识下final的作用
1,final修饰类,表示这个类不能被继承.
public final class FinalDemo {}//final修饰类,表示不能被继承
public class Test extends FinalDemo{}//报错,提示不能继承final类
但一般什么时候要这样设计一个类?
就是当你要这个类所有的方法只能被使用,不能被重写时就用final来修饰这个类.JAVA中八大类型的包装类Integer,String等就是final类.这些类的就像是一种规定.为了让大家保持统一性,我们不能随意去动它.
不过日常开发中这样的类很少,用final来修饰类一定要考虑好是否要这么做.
用final修饰类的目的就是让编译器排查哪个类继承了它,然后会报错让你去处理
2,final修饰方法,表示这个方法不能被重写
public class FinalDemo {
public final void fun(){}//final修饰方法
}
public class Test extends FinalDemo {
public final void fun(){}//报错,提示不能重写final方法
}
在日常开发中,什么样的方法我们不希望它被重写?
static方法,被static修饰的东西.它的意义和功能总是非常明确的。明确的东西我们就不需要在重新弄一套.因此static方法很适合用final修饰.
基本所有被final修饰的方法都是static方法.因为就设计上而言,只有static方法适合用final修饰
用final修饰方法的目的就是编译器能给你排查出哪个类去重写了它。然后会报错来让你去处理
3,被final修饰的变量不能被修改
public class FinalDemo {
public final int i = 0;//final修饰变量
}
public static void main(String[] args) {
FinalDemo finalDemo = new FinalDemo();
finalDemo.i = 3;//报错,提示final变量不能被修改
}
一般什么样的变量我们不希望它被修改?
static变量,上面说到,被static修饰的东西,它的功能和意义总是非常明确.
比如public final static int STOP = 1;
这句话是意思就是我要"停止"表示成1.它表示的意义很明确。不希望它被修改.
用final修饰方法的目的就是让编译器排查有哪个地方修改了它,然后报错让你去处理
被final修饰的变量被称为常量,因为不能改了
拓展:为了让final修饰的变量变现得更有意义,它的命名规则通常是全大写,单词之间用下划线隔开.这样程序员就能明白这个变量的意思
比如public final static String IS_GOOD = “yes”
4,被final修饰的参数不能被修改
public class FinalDemo {
public void fun(final String msg){//finalx修饰参数
msg = "a";//报错,提示被final修饰不能修改
System.out.println(msg);
}
}
一般什么情况要要求参数不能被修改?
当你确定这个参数在这个方法中从头到尾都没有变动只是被原模原样的用时.你可以考虑用final修饰这个参数,
用final修饰参数的目的就是让编译器排查在这个方法体中有哪个地方修改了它,然后报错让你去处理
注意点:
public class FinalDemo {
public void fun(final String msg){//finalx修饰参数
fun1(msg);
System.out.println(msg);
}
public void fun1(String msg){
msg = "s";//不报错
}
}
在fun()里面调用fun1()然后把被final修饰的msg传到fun1()里,它是可以在fun1()被修改的.因为fin1()里面的msg是fun()给的新东西.
执行以下语句,观察注释
public static void main(String[] args) {
FinalDemo finalDemo = new FinalDemo();
finalDemo.fun("as");//输出as而不是s
}
final能提升性能吗?
我们用final的目的是为了能满足不让改的设计。这能让程序员更加懂你这个被final修饰的这些东西的意思
实际上final对性能没有什么影响.
至于测试,我对JVM还不理解,只能简单的用JAVA自带的System.currentTimeMillis();来测试时间.有兴趣的可以自己去测试下.时间上没什么区别.