final关键字
一、final关键字的概述
学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写.那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的.为了避免这种随意的改写的情况,java提供了final
关键字,用于修改不可改变内容.
- final :不可改变.可以修饰类,方法和变量.
二、fianl关键字的用法
2.1fianl用于修饰类
格式如下:
final class 类名 {
}
注意事项 :被final
修饰的类是不能被继承的,但内容可以修改.
2.2fianl用于修饰成员方法
格式如下:
权限修饰符 final 返回值类型 方法名 (参数列表) {
}
注意事项 :被final
修饰的方法不能被重写,重写时就会编译报错.
2.3fianl用于修饰局部变量
-
局部变量——基本类型
基本类型的局部变量,被
final
修饰后,只能赋值一次,不能更改.代码如下:public class FinalDemo1 { public static void main(String[] args) { // 声明变量,使用final修饰 final int a; // 第一次赋值 a = 10; // 第二次赋值 a = 20; // 报错,不可重新赋值 // 声明变量,直接赋值,使用final修饰 final int b = 10; // 第二次赋值 b = 20; // 报错,不可重新赋值 } }
-
局部变量——应用类型
引用类型的局部变量,被
final
修饰后,只能指向一个对象,地址不能在更改.但不影响内部的成员变量值的修改,代码如下:public class FinalDemo2 { public static void main(String[] args) { // 创建 User 对象 final User u = new User(); // 创建 另一个 User对象 u = new User(); // 报错,指向了新的对象,地址值改变。 // 调用setName方法 u.setName("张三"); // 可以修改 } }
-
2.4fianl用于修饰成员变量
成员变量涉及到初始化的问题初始化方式有两种,只能二选一:
-
显示初始化:
public class User { final String USERNAME = "张三"; private int age; }
-
构造方法初始化:
public class User { final String USERNAME ; private int age; public User(String username, int age) { this.USERNAME = username; this.age = age; } }
总结 :
-
被
final
修饰的常量名称,一般都有书写规范,所有字母都大写.final: 概述:关键字,用于修饰不可改变内容 使用:final关键字可以修饰类,方法,变量 final关键字修饰类:被final修饰的类是不能被继承的 格式: public final class 类名{ } final关键字修饰方法:被final修饰的方法是不能被重写的 格式: 权限修饰符 final 返回值类型 方法名(参数列表){ } final关键字修饰变量:被final修饰的变量,只能赋值一次,不能重复赋值 格式: final 数据类型 变量名 = 值; 推荐 final 数据类型 变量名; 变量名 = 值; =========================================================== // final关键字修饰局部变量: 基本数据类型,引用数据类型 // final关键字修饰局部变量: 基本数据类型 final int NUM = 10; // num = 20; 错误的,因为num被final修饰,变成了常量,常量只能赋值一次 System.out.println(NUM);// 10 final int NUM2; NUM2 = 100; // num2 = 1000; 错误的,因为num2被final修饰,变成了常量,常量只能赋值一次 System.out.println(NUM2);//100 =========================================================== // final关键字修饰局部变量: 引用数据类型 final Animal anl = new Animal(); anl.name = "jack"; System.out.println(anl.name);// jack // anl = new Animal();错误的,因为anl被final修饰,变成了常量,常量只能赋值一次 anl.name = "rose"; System.out.println(anl.name);// rose // final关键字修饰成员变量:只能赋值一次 final int AGE = 18;// 直接赋值 final int WEIGHT; String name; // 通过构造方式赋值: 一定要保证所有构造方法都可以给该常量赋值 public Dog(){ this.WEIGHT = 30; } public Dog(String name){ this.WEIGHT = 30; this.name = name; }