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 = "无名氏";
}