一、final 关键字

  1、概述

    子类继承父类后,可以改写父类内容,如方法重写。但是我们却不能随意的去继承 API 中提供的类,然后改写其内容。

    这是因为 Java  提供了 final 关键字,用于修饰不可改变内容。

  2、作用范围

    在Java中声明类、 变量方法时, 可使用关键字 final 来修饰,表示“最终的” 。

    (1)final 标记的类不能被继承。

      被 final 修饰的类,不能被继承。提高安全性, 提高程序的可读性。

      可以用来修饰 外部类 和 内部类

    (2)final 标记的方法不能被子类重写。

       final 可以用来修饰静态方法 和 非静态方法,不能被重写,可以被继承。

    (3)final 标记的变量(成员变量或局部变量)即称为常量。

      final 可以用来修饰变量(成员变量(类变量、实例变量)、局部变量)

二、修饰类

  1、使用方式

    定义格式:

final class 类名 {
   //  方法体
}

    像 Java 中的 String,Math,System,Scanner 这些类都是声明为 final 类,目的就是供使用,而不让随意改变其内容。

  2、注意点

    final 修饰的类一定不能被继承。

三、修饰方法

  1、使用方式

    定义格式:

其他修饰符 final 返回值类型 方法名(参数列表){
    //方法体
}

  2、注意点

    (1)如果重写 final 修饰的方法,编译会报错;

    (2)对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。

四、修饰变量

  1、修饰成员变量

    final修饰属性:可以考虑赋值的位置有:显式初始化、代码块中初始化、构造器中初始化

    ① 显示初始化

1 public class User {
2     final String USERNAME = "张三";
3     private int age;
4 }

    ② 代码块中初始化

1 public class User {
2     final String USERNAME;
3        {
4           USERNAME = "张三";
5        }
6     private int age;
7 }

    ③ 构造器中初始化

1 public class User {
2     final String USERNAME ;
3     private int age;
4     public User(String username, int age) {
5         this.USERNAME = username;
6         this.age = age;
7     }
8 }

        注意:

    (1)对于final的成员变量,要么使用直接赋值,要么通过代码块或者构造方法赋值。三者选其一。

    (2)必须保证类当中所有重载的构造方法,都最终会对 final 的成员变量进行赋值。

    (3)static final 用来修饰属性:全局常量

 

  2、修饰局部变量

    (1)修饰局部变量——基本数据类型

        基本类型的局部变量,被 final 修饰后,只能赋值一次,不能再更改。

        Demo:

 1 public class FinalDemo1 {
 2     public static void main(String[] args) {
 3         // 声明变量,使用final修饰
 4         final int a;
 5         // 第一次赋值
 6         a = 10;
 7         // 第二次赋值
 8         a = 20; // 报错,不可重新赋值
 9         // 声明变量,直接赋值,使用final修饰
10         final int b = 10;
11         // 第二次赋值
12         b = 20; // 报错,不可重新赋值
13     }
14 }

 

    (2)修饰局部变量——引用类型

      引用类型的局部变量,被 final 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改

      Demo:

 1 public class FinalDemo2 {
 2     public static void main(String[] args) {
 3         // 创建 User 对象
 4         final User u = new User();
 5         // 创建 另一个 User对象
 6         u = new User(); // 报错,指向了新的对象,地址值改变。
 7         // 调用setName方法
 8         u.setName("张三"); // 可以修改
 9      }
10 }

 

      注意:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。

    Demo:

 1 public class Something {
 2     public static void main(String[] args) {
 3         Other o = new Other();
 4         new Something().addOne(o);
 5     }
 6     public void addOne(final Other o) {
 7         // o = new Other();   错误的 形参只能指向原来的对象,不能指向新的对象
 8         o.i++;
 9     }
10 }
11 class Other {
12     public int i;
13 }

 

  3、注意

   (1)被 final 修饰的常量名称,一般都有书写规范,所有字母都大写。

   (2)final 用来修饰变量:此时的"变量"就称为是一个常量。

    

posted on 2020-11-14 18:26  格物致知_Tony  阅读(152)  评论(0编辑  收藏  举报