final意思是最终的,不可变的。
一 final修饰的类
不能被继承
package cn.dongli.finalDemo;
final class A {
}
//编译不通过,因为A被final修饰了,B不能再继承A
class B extends A{
}
二 final修饰的方法
不能被重写
package cn.dongli.finalDemo;
class A {
public final void print(){
System.out.println("打印A......");
}
}
//编译不通过,因为A被final修饰了,B不能再继承A
class B extends A{
//编译不通过,因为类A中的方法print已经被final修饰了,类B继承类A后,不能重写print方法
public void print(){
System.out.println("打印B......");
}
}
三 final修饰局部变量之基本数据类型
值不能修改
package cn.dongli.finalDemo;
public class FinalTest01{
public static void main(String[] args) {
final int i=1;
int i=2;//编译不通过,因为i被final修饰了,只能赋一次值
}
}
四 final修饰局部变量之引用数据类型
一旦指向某一个对象,不能再指向其他的对象,但是该引用指向的对象的内部数据是可以改变的。
package cn.dongli.finalDemo;
import java.util.ArrayList;
public class FinalTest02 {
public static void main(String[] args) {
final ArrayList<Integer> myList=new ArrayList<>();
//myList=new ArrayList<>();//编译不通过,因为myList已经指向了一个对象,且它被final修饰了,不能再指向其他对象
myList.add(1);//可以修改myList指向的对象的内部数据
System.out.println(myList.toString());//输出[1]
}
}
五 final修饰实例变量
该实例变量只能赋值一次。
我们知道,对于普通的实例变量来说,如果我们不手动赋值的话,系统会赋默认值。
但是实例变量被final修饰后,该变量就只能被赋值一次了,如果系统给该变量赋了默认值,这个值对我们来说就没什么实用价值,因为我们后期也改不了了。所以,sun规定,被final修饰的实例变量,程序员必须手动赋值。
package cn.dongli.finalDemo;
public class FinalTest03 {
//编译不通过,sun规定,被final修饰的实例变量必须手动赋值
final int age;
}
再讲手动赋值之前,我们先思考一个问题,实例变量什么时候赋值的呢?答案是在执行构造方法时赋值的,不管是我们手动赋值还是系统赋默认值,真正给该变量赋值的时机都是在执行构造方法时。
被final修饰的实例变量的手动赋值方式:
1. 在变量后面赋值
package cn.dongli.finalDemo;
public class FinalTest04 {
//直接在变量后面赋值
final int age=18;
public static void main(String[] args) {
}
}
2. 在构造方法中赋值
package cn.dongli.finalDemo;
public class FinalTest05 {
final int age;
//在构造方法中赋值
public FinalTest04(int age) {
this.age = age;
}
public static void main(String[] args) {
}
}
注意:一般情况下,如果一个实例变量被final修饰了,那么我们会把这个变量声明为静态变量。
六 final修饰静态变量
static+final修饰的变量称为常量。
常量名大写,每个单词之间用"_"连接。
静态变量和常量都存放在方法区中,并且都是在类加载时初始化。
package cn.dongli.finalDemo;
public class FinalTest06 {
static final double PI=3.1415;
//在构造方法中赋值
public static void main(String[] args) {
System.out.println(PI);
}
}