Java中的final关键字

来源:互联网 发布:手机视频拼接软件 编辑:程序博客网 时间:2024/06/16 05:38

final关键字在Java中十分重要,是一个常用的修饰符。

final关键字的作用范围

final关键字可以用于修饰类、字段、方法,当用于类上时,此类就成为了不可继承的最终类,用于方法时就成了不能覆写的最终方法,用于字段时,就成了最终的变量,只能在初始化的时候赋值,而不能在之后重新赋值。

final类

final修饰的类不可继承,无法有子类。Java中封装的思想是将类的属性和方法的实现细节隐藏起来,但是继承却破坏了封装,使子类可以继承父类的方法和字段。为了解决这个问题,所以出现了final关键字,final关键字修饰的类,无法有子类,也就没有了破坏封装的问题。一般使用于工具类和基本数据类型上,比如String类和Integer等表示数据的类即不可继承。在String类的源码上可以看到:

public final class String

以及Integer类的声明:

public final class Integer extends Number implements Comparable<Integer> 

可以看到以上两个类都是final类,因此无法继承。final类一般有几个特点,如:
1、某个类不是专门为继承而设计的,比如String等表示数据的类。
2、有时候出于安全考虑,类的属性和实现细节不允许类改动的,使用final可以防止通过继承的方式覆写父类的方法,从而改变源代码的实现。
3、确定现在以及以后此类都不会被继承,比如工具类。

final class Person {}class Student extends Person {//错误用法,无法继承final类}

final修饰的方法

final修饰的方法不能覆写,这也是针对继承来说的,因为没有继承就不会存在覆写的概念。当有一些方法是父类已经提供好了的,不允许子类改写的,就可以使用final关键字修饰,子类无法覆写此方法,只能使用父类提供的,从而防止子类修改这个方法的实现。

class Person {    public final String name = "无名氏";    public final void sayHello(){        System.out.println("这是一个最终的方法,子类无法覆写");    }}class Student extends Person{    public void sayHello(){        System.out.println("此方法将会报错,无法覆写父类方法");    }}

final修饰的变量

final修饰的变量只能在声明的时候赋初值,之后就不可以再次赋值。一般会加上static修饰符使用,让外界可以用类名直接调用这个变量,无需创建实体。

public class StaticDemo {    public static void main(String[] args) {        Person p = new Person();        p.name="赋值失败,无法给最终变量赋值";    }}class Person {    public final String name = "无名氏";}

和static的关系

final一般会和static一起使用,static是静态修饰符,可以将一个方法或者变量提升为整个类的成员,而一般不能改变的方法或变量都是高度集中的,因此需要static将这个方法或者变量提升为类的成员。例如数组排序方法,可以使用static关键字将其提升为类成员,其他地方即可使用类名直接调用,而无需专门创建一个工具类的实体。

public class StaticDemo {    public static void main(String[] args) {        System.out.println(Person.name);//可以用类名调用    }}class Person {    public final static String name = "无名氏";}
0 0