零、本讲学习目标
1、掌握final 关键字修饰类
2、掌握final 关键字修饰方法
3、掌握final 关键字修饰变量
一、final关键字概述
final关键字可用于修饰类、变量和方法,它有“不可更改”或者“最终”的含义。因此被final修饰的类、变量和方法将具有以下特性。
- final修饰的类不能被继承
- final修饰的方法不能被子类重写
- final修饰的变量(成员变量和局部变量)是常量,只能赋值一次
二、final关键字修饰类
1、final修饰类的作用
Java中的类被final关键字修饰后,该类将不可以被继承,也就是说不能够派生子类,因此我们将final关键字修饰的类叫做“最终类”。在实际开发中,如果我们希望某个类不能被继承,我们就用final关键字来修饰这个类。
2、案例演示final修饰类
- 创建Example1401.java
package net.hw.lesson14;
/**
* 功能:演示final修饰类
* 作者:华卫
* 日期:2020年05月08日
*/
// 使用final关键字修饰Animal类
final class Animal {
}
// 继承Animal类创建Dog类
class Dog extends Animal {
}
public class Example1401 {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
- 程序编译报错
当Dog类继承一个被final关键字修饰的Animal类之后,在编辑器里,Animal类下出现红色波浪线,鼠标移到Animal类上,会弹出一个错误提示小窗口“Cannot inherit from final 'net.hw.lesson14.Animal(无法继承最终类net.hw.lesson14.Animal
)”。由此可见,被final关键字修饰的类为最终类,不能被其它类继承。
三、final关键字修饰方法
1、final修饰方法的作用
当一个类的某个方法用关键字final来修饰之后,该类的子类将无法重写该方法,因此final关键字修饰的方法也叫“最终方法”。在实际开发中,如果希望父类的某个方法不能被子类重写,那么我们就用final关键字来修饰该方法。
2、案例演示final修饰方法
- 创建Example1402.java
package net.hw.lesson14;
/**
* 功能:演示final修饰方法
* 作者:华卫
* 日期:2020年05月08日
*/
// 定义Person类
class Person {
// 用final关键字修饰walk()方法
public final void walk() {
System.out.println("人在行走……");
}
}
// 继承Person类创建Man类
class Man extends Person {
@Override
public void walk() {
System.out.println("男人在行走……");
}
}
public class Example1402 {
public static void main(String[] args) {
Man man = new Man();
man.walk();
}
}
- 程序编译报错
当子类Man重写父类Person的walk()方法时候,编辑器里,子类的walk()方法头下出现红色波浪线,将鼠标移到上面,弹出一个小窗口显示错误提示信息“‘walk()’ cannot override ‘walk()’ in ‘net.hw.lesson14.Person’; overridden method is final(walk()方法不能重写net.hw.lesson14.Person类的walk()方法
)”。由此可见,被final关键字修饰的方法为最终方法,子类不能重写该方法。
四、final关键字修饰变量
1、final修饰变量的作用
Java中被final修饰的变量被称为常量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值就不能被修改。如果再次对该变量进行赋值,则程序会在编译时报错。
2、案例演示final修饰变量
(1)final修饰局部变量
- 创建Example1403
package net.hw.lesson14;
/**
* 功能:演示final修饰局部变量
* 作者:华卫
* 日期:2020年05月08日
*/
public class Example1403 {
public static void main(String[] args) {
// 声明静态局部变量
final int age;
// 给静态局部变量第一次赋值
age = 18;
// 给静态局部变量第二次赋值
age = 20;
}
}
- 给静态局部变量第二次赋值时,程序编译报错
系统提示“变量age也许已经被赋值了”,由此可见,被final修饰的变量为常量,它只能被赋值一次,其值不可改变。 - 声明静态局部变量的同时给它赋初值
(2)final修饰成员变量
- 创建Example1404
package net.hw.lesson14;
/**
* 功能:演示final修饰成员变量
* 作者:华卫
* 日期:2020年05月08日
*/
public class Example1404 {
// final修饰成员变量,并赋初值
static final int age = 18;
public static void main(String[] args) {
System.out.println("age = " + age);
}
}
- 运行程序,查看结果
- 再次对静态成员变量赋值,程序编译报错
系统提示:Cannot assign a value to final variable ‘age’(不能给最终变量“age”赋值) - 静态成员变量跟静态局部变量不同,不能先声明后赋值
系统提示:Variable ‘age’ might not have been initialized(变量age也许未被初始化)
五、课后作业
1、类的final变量和普通变量有什么区别?
同学们输入上述程序并运行,看看输出的结果,并解释为什么。
2、被final修饰的引用变量指向的对象内容可变吗?
同学们输入上述程序并运行,看看输出的结果,并解释为什么。
再次对静态局部变量test赋值,程序编译就会报错。
3、final和static有什么区别?
同学们输入上述程序并运行,看看输出的结果,并解释为什么。