final关键字
引入
象一下,你有一张非常特别的纸。这张纸上画着一幅画,画得非常好,所以你决定给这张纸起一个名字叫做“我的最爱画”。因为这张画这么特别,你不希望任何人修改它,所以你在画的边框上写上了“不准修改”,这样别人就知道不能在这张画上加任何东西或者擦掉任何东西了。
在Java中,当你创建一个变量时,你其实就像是拿出了一张纸,然后给它一个名字。如果你想要这个变量始终保持不变,不被其他人(或者其他代码)修改,你可以在这个变量名字前面加上final关键字。这就像是在你的纸上写上了“不准修改”。
举个例子: 假如我们有一个变量叫做myNumber
,我们不希望它被改变,我们就这样写:
final int myNumber = 10;
现在myNumber
的值是10,并且永远都会是10,因为我们用final标记了它,就像在纸上写上了“不准修改”。
同样的道理适用于方法和类。如果你有一个方法,你不希望任何其他的方法覆盖它(就像别的画家来重新画你的画),你可以使用final关键字。如果你有一个类,你不希望其他的类继承它(就像别人不能拿你的画去当作他们自己的作品),你也可以使用final关键字。
所以记住,final就像是在Java的世界里给变量、方法或者类加上“不准修改”的标签。
基本介绍
final可以修饰类,属性,方法,局部变量
当出现以下需求时,就会用到final
(1)当父类不再希望被继承时
(3)当父类的某个方法不希望被覆盖/重写时
(4)当我们不希望类的属性被修改时
(5)但我们不希望局部变量被修改时
package com.LJX.Static_;
public class final_ {
public static void main(String[] args) {
//Cannot assign a value to final variable 'TAXT_RATE'
// new E().TAXT_RATE = 100;
}
}
//(1)当父类不再希望被继承时
final class A{ }
//class B extends A{}报错继承不了
//(3)当父类的某个方法不希望被覆盖/重写时
class C{
final public void hi(){
}
}
class D extends C{
@Override
public void hi() {
super.hi();
}
}
//(4)当我们不希望类的属性被修改时
class E{
//当类中的变量被final修饰,可看作为常量
//类似于C语言中的const
final public double TAXT_RATE = 0.03;
}
//(5)但我们不希望局部变量被修改时
class F{
public void cry(){
final double NUM = 100;
// NUM = 0;
System.out.println("MUN = " + NUM);
}
}
注意事项与细节
-
final修饰的属性又叫常量,一般用 XX_XXX_XX命名
-
final修饰的属性必须赋初始值,并且不能再修改
当赋值的属性时普通属性,赋值的位置可以有三个,
(1)定义时
(2)在构造器
(3)在代码块
当修饰的是静态变量时
(1)定义时
(2)静态代码块
-
final类不能继承,但可以实例化对象
-
如果类不是final类,当是有final方法,虽方法不能重写,但类可以继承
-
一般来说,final类中的方法没有必要去进行final
-
final不能修饰构造器
-
final和static往往搭配使用,效率更高,底层做了优化
-
包装类(Integer,Double, Boolean)也是final类
package com.LJX.Static_;
public class final_02 {
public static void main(String[] args) {
//当调用没有被final修饰的属性,静态代码块也执行了
// System.out.println(fuck.RATE);
//final 修饰,可以当做普通变量使用不会引起类的加载
System.out.println(fuck.RATE);
}
}
//final和static往往搭配使用,效率更高,底层做了优化
class fuck{
final public static int RATE = 100;
static {
System.out.println("静态代码块执行");
}
}