首页 > 技术文章 > java学习面向对象之final关键字

sunchuanzhen 2013-09-28 21:49 原文

之前我们讲过继承的相关知识了,继承就是子类继承父类的属性和方法并且还可以覆盖父类的方法。但是这样有一个缺陷是什么呢,就是当我们一个类当中涉及一些封装的核心的东西或者对整个系统非常关键的方法或者类的时候,这个时候如果子类覆盖掉父类的方法将会对我们带来安全隐患。为了能够继承父类的方法,同时又能够保证我们类的安全性,这个时候我们就用到了final这个关键字。

final关键字之一:

  final从字面意思上来理解的话,就是最后的意思,也就是说这个方法一经定义之后,就是最后的,不能更改的。当我们用这个关键字修饰一个类的方法的时候,任何继承自这个类的子类,都不能够在自己的方法当中来覆盖他父类的这个方法。代码示例:

  

 1 class Animal
 2 {
 3 
 4     final void die()
 5     {
 6 
 7         System.out.print("Every animal will die");
 8 
 9     }
10 
11     void eat()
12     {
13 
14         System.out.print("Every animal must eat something");
15 
16     }
17 
18 }
19 
20 class Dog extends Animal
21 {
22 
23     void die()
24     {
25 
26         System.out.print("Is dog going to die???");
27 
28     }
29 
30     void eat()
31     {
32 
33         System.out.print("Dog eat grass and meat!!");
34 
35     }
36 
37 }

如果这个时候我们编译的时候,就会提示我们:

被final关键字修饰的方法在子类当中是不能够被覆盖的。

final用法二:

final除了可以修饰一个类当中的某个方法不能够被覆盖之外,还能够修饰一个类,使这个类不能够被继承:

代码示例:

 1 final class Animal
 2 {
 3 
 4     void die()
 5     {
 6 
 7         System.out.print("Every animal will die");
 8 
 9     }
10 
11     void eat()
12     {
13 
14         System.out.print("Every animal must eat something");
15 
16     }
17 
18 }
19 
20 class Dog extends Animal
21 {
22 
23     void die()
24     {
25 
26         System.out.print("Is dog going to die???");
27 
28     }
29 
30     void eat()
31     {
32 
33         System.out.print("Dog eat grass and meat!!");
34 
35     }
36 
37 }

这个地方就会报错:

final用法三:

final还可以修饰一个变量,被final修饰之后,这个变量一经定义就不能够被修改了。那么这么做有什么意义呢?这样做的意义就是,有可能我们用某一个数字代表着一类含义,但是我们单纯的定义这个数字,并不能提供很好的阅读性,为了能够保证代码的阅读性,我们这里提供一个变量来描述这个数字,同时呢也不能让这个变量被改变,因为这个常量改变了,这个意义也就改变了,所以必须要用final关键字来修饰。

 1 class Animal
 2 {
 3 
 4     final int a = 10;
 5     void die()
 6     {
 7 
 8         System.out.print("Every animal will die");
 9 
10     }
11 
12     void eat()
13     {
14 
15         System.out.print("Every animal must eat something");
16 
17     }
18 
19 }
20 
21 class Dog extends Animal
22 {
23 
24     void die()
25     {
26 
27         System.out.print("Is dog going to die???");
28 
29     }
30 
31     void eat()
32     {
33 
34         System.out.print("Dog eat grass and meat!!");
35 
36     }
37 
38 }
39 
40 
41 class FinalDemo
42 {
43 
44     public static void main(String[] args) {
45         
46         Dog d = new Dog();
47         d.a = 100;//会报错
48         System.out.print(d.a);
49 
50     }
51 
52 }

如果我们这样写之后,在后期为a赋值的话就会报错:

final关键字需要注意的细节:

1、final和private一起使用是没有意义的。

2、用final关键字修饰的成员变量,在初始化的时候,必须要赋值。

3、

final关键字的特点:

1、final是一个修饰符,能够修饰类,方法,变量。

2、final修饰的类不能够被其他类继承。

3、final修饰的变量,只能够被赋值一次。为什么要用final修饰变量?如果在一个程序当中,一个数据是固定的,直接用这个数据就可以了,但是这样阅读性较差。所以这里要给数据起个名称,并且加个final固定,使这个变量名称的值不能够改变。写法规范,用final修饰的常量最好用大写字母来标识,这样能更好的区分是常量还是变量,如果有多个单词,多个单词之间用下划线链接。

4、final修饰的成员方法不能够被覆盖。

5、内部类只能访问被final修饰的局部变量。

推荐阅读