final关键字可以用来修饰引用、方法和类。

一、用来修饰一个引用

  1.  如果引用为基本数据类型,则该引用为常量,该值无法修改;
  2.  如果引用为引用数据类型,如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  3.  如果引用类的成员变量,则必须赋值,否则编译会报错。

如下例子:

class Person {
    String name;
    //1.此处不赋值则会报错
    final int age =100;

    String walk(){
        return "Person can walk";
    }
    final String sleep(){
        return "Person need sleep!";
    }
}
public class Demo {
    public static void main(String[] args) {
        final int age = 100;
        //final修饰的基本数据类型为常量,无法修改
        //age = 90;

        //2. 对象本身的属性可以修改
        Person person = new Person();
        person.name = "lile";

        //2.数组地址不可修改
        final int[] array = {1,2,3,4};
        array[3] = 100;
        //arr = new int[]{1,1,1,1};
    }

 

二、用来修饰一个方法

当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。

如果创建最终类似乎不必要,而又想保护类中的一些方法不被重写,可以用关键字final来指明那些不能被子类重写的方法,这些方法称为最终方法。

class Person {
    //say()被final修饰,则此方法不可以被子类重写,但是可以被子类继承
    public final void say() {
        System.out.println("Person can talk!");
    }
    public void eat() {
        System.out.println("Person can eat!");
    }
}
class Famale extends Person {
    //1. final修饰的方法不能被重写,但此方法仍然被继承
    /*@Override
    public void say() {
        System.out.println("Famale also can talk!");
    }*/
    
    public void eat() {
        System.out.println("Famale also can eat!");
    }
}
public class Demo {
    public static void main(String[] args) {
        Famale famale = new Famale();
        famale.say();
    }    
}

 

三、用来修饰类

当用final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类。

final class Person {    
}
//class Teacher extends Person { }
//class MyString extends String{}
public class Demo {
}

在程序设计中,最终类可以保证一些关键类的所有方法,不用担心在以后的程序维护中,由于不经意的定义子类而被修改;

同时最终方法可以保证一些类的关键方法不会再以后的程序维护中由于不经意定义子类和覆盖子类的方法而被修改。

但需要注意的是一个类不能既是最终类又是抽象类,即关键字abstract和final不能合用。在类声明中,如果需要同时出现关键字public和abstract(或final),习惯上,public放在abstract(或final)的前面。