夯实Java基础(九)——final关键字

1、前言

Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的。

final从字面意思是不可更改的,最终的意思,它可以用来修饰类、方法、变量(包括成员变量和局部变量)、参数。

2、final修饰类

final修饰类,表示该类不能再被继承了,如果一个类它的功能比较完整,不需要扩展功能,我们就可以使用final来修饰。我们最常用String、Integer、System等类就是用final修饰的,其不能再被其他类所继承。

用final修饰类如果被继承了那么在编译的时候就会报错。

3、修饰方法

final修饰方法,表示这个方法不能被子类方法重写。如果你认为一个方法的功能已经足够完整了,不需要再去子类中扩展的话,我们可以声明此方法为final。比如Object类中getClass()方法就是final修饰的。

 

注意:

a. 一个类的private方法会隐式的被指定为final方法。

b. 如果父类中有final修饰的方法,那么子类不能去重写。

 注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。

4、修饰变量

final修饰变量表示是常量,一般都和static一起使用,用来定义全局常量。final无论修饰的是成员变量还是局部变量,都必须进行显式初始化,如下。

 1 public class FinalTest {
 2     //显式初始化
 3     final int AA=11;
 4     final int BB;
 5     final int CC;
 6     final int DD;
 7     //构造代码块初始化
 8     {
 9         BB=22;
10     }
11     //构造方法初始化
12     public FinalTest(){
13         CC=33;
14         DD=44;
15     }
16 
17     public FinalTest(int CC, int DD) {
18         this.CC = CC;
19         this.DD = DD;
20     }
21 }

我们可以通过显式初始化、构造代码块初始化、构造方法初始化这三种方式对final修饰的变量进行初始化。

前面都是讲的final修饰基本数据类型的变量,如果final修饰引用变量会是怎么样,我们来看一下举例:

 1 public class FinalTest {
 2 
 3     public static void main(String[] args) {
 4         final AA aa = new AA();
 5         //这里在引用其他的对象就会报错Cannot assign a value to final variable 'aa'
 6         //aa=new AA();
 7         aa.i++;
 8         System.out.println(aa.i);
 9     }
10 
11 }
12 
13 class AA{
14     int i;
15 }
16 
17 //运行结果:1

可以看到,虽然我们将引用变量用final修饰了,但是该对象的变量 i 我们还是可以进行修改,而这个变量的引用不能再指向另一个对象了。表明final修饰的是引用变量,就不能再指向其他对象,但是如果该对象内的变量不是final修饰的,其变量的值是可以进行修改的。

5、修饰参数

final修饰参数准确的来说应该是修饰形参,表明该形参的值不能被修改。

 1 public class FinalTest {
 2 
 3     public static void main(String[] args) {
 4         FinalTest f=new FinalTest();
 5         f.show(5);
 6     }
 7 
 8     public void show(final int param){
 9         //编译报错:Cannot assign a value to final variable 'param'
10         //param=10;
11         System.out.println(param);
12     }
13 }

我在使用final修饰形参时,表明此形参是一个常量。当我们调用方法的时候,给形参进行赋值,一旦赋值以后,就只能在该方法使用,而且不能进行重新赋值操作,否则编译报错。如果形参是引用类型,则引用变量不能再指向其他对象,但是该对象的内容是可以改变的。

猜你喜欢

转载自www.cnblogs.com/tang-hao-/p/11241293.html