final关键字
final关键字代表最终、不可改变的
常见的四种用法:
- 可以用来修饰一个类
- 可以用来修饰一个方法
- 可以用来秀是一个局部变量
- 可以用来修饰一个成员变量
我们将逐一分析这四种用法!
1. final关键字用来修饰类
1.1 格式:
public final class 类名称{
//....
}
1.2 含义:当前这个类不能有任何的子类。(太监类)
1.3 注意:
- 太监类不可以有子类,但是可以有父类
- 太监类的所有方法都不能被覆盖重写,因为没有子类
2. final关键字用来修饰成员方法
2.1 格式:
修饰符 final 返回值类型 方法名称(参数列表){
//方法体
}
2.2 含义:当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
2.3 代码演示:不能重写父类中的 final 方法
-
2.3.1 来个父类
public class Fu { //final 修饰过的方法 public final void methodFinal(){ System.out.println("这可是最终方法"); } }
-
2.3.2 再来个子类
public class Zi extends Fu { /*错误写法,子类不能重写父类中的 final 方法,强写灰飞烟灭 @Override public void methodFinal(){ System.out.println("我偏要重写"); } */ }
2.4 注意:对于类和方法来说,abstract和final关键字是不能被同时使用的,因为自相矛盾,abstract修饰的方法是抽象方法,子类必须覆盖重写抽象方法才行,可如果加上了final后,该方法又不能被覆盖重写了,那我是覆盖好,还是不覆盖好呢?编译器报错之后,就什么都不用想了。
3. final关键字用来修饰一个局部变量
一旦使用final来修饰局部变量,那么这个变量就不能进行更改了
记住:“一次赋值,终身不变”
3.1 对于基本类型而言(int、double、float…)
只要保证有一次赋值即可,并且赋值之后再也不改变
对于基本类型而言,不可改变的是变量当中的数据不可改变
写法1:
final int num1;
num1 = 3; //正确
写法2:
final int num2 = 3; //
3.2 对于引用类型而言(除开基本类型,其它的都可叫引用类型)
对于引用类型而言,不可变的是变量中的地址值不可改变
代码演示:什么叫地址值不可改变
-
创建一个引用类型,SuperStar类
public class SuperStar { private String name; public SuperStar() { } public SuperStar(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
看main中的注释
public class Demo06Main { public static void main(String[] args) { //创建一个SuperStar 对象叫周杰伦, 用 final 修饰 final SuperStar star = new SuperStar("周杰伦"); //star 里面存放的是什么?是指向周杰伦的地址,我现在把周杰伦的地址打印下来 System.out.println(star); //star 经过 final 修饰之后,它存放的地址值将不可改变,我们尝试将 star 的地址改成 胖伦的地址 // star = new SuperStar("胖伦"); 报错,star已经指向了周杰伦的地址,就不能再指向胖伦的地址 //我们虽然不可再改变 star 指向的地址,但是我们可以改变地址指向的内容,把周杰伦改为乐坛天王 star.setName("乐坛天王"); //重新打印star的地址,发现地址值没有改变 System.out.println(star); //打印地址指向的内容,发现周杰伦已经蜕变成乐坛天王 System.out.println(star.getName()); } }
4. final关键字修饰成员变量
4.1 成员变量和局部变量:
局部变量是在某个函数、方法里面的成员
成员变量是一个类中的数据成员
public class Student{
private int num; //成员变量
public void method(){
int num; //局部变量
}
}
4.2 对于成员变量来说
final关键字修饰之后,这个变量也照样不可变,但是注意:
- 由于成员变量具有默认值,所以用了 final 之后必须手动赋值。
- 手动赋值,①可以选择直接赋值 (在声明时就给它赋值);②也可以选择构造方法赋值,但是无参构造方法中,必须对其赋一个初值,避免调用无参构造时,没有东西给它赋值。①和②只能选一个
- final修饰之后,该成员变量的setter就失去作用了,都不可改变了,还怎么set它