-
final关键字
-
修饰类
-
不可以被继承
-
final修饰的类不能被继承,所以不可以和abstract一起用于声明类,因为abstract声明的类必须子类重写他的抽象方法,同样final也不能用来修饰接口。
-
-
-
修饰变量
-
final只能赋值一次,不可以重新赋值
1.变量可分为引用数据类型和基本数据类型两种
final修饰基本数据类型:表示该数据为常量;
final修饰引用数据类型(对象): 表示这个变量被赋予的引用是不可变的
这里需要注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。
被final修饰的变量必须被初始化。初始化的方式以下几种:
1.在定义的时候初始化。
2.final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
3.静态final变量可以在定义时初始化,也可以在静态初始化块中初始化,不可以在初始化块中初始化。
4.final变量还可以在类的构造器中初始化,但是静态final变量不可以。
public class FinalTest{
public final int A=10; //在定义时初始化
public final int B;{B=20;} //在初始化块中初始化
//非静态final变量不能在静态初始化块中初始化
public final int C;static{//C=30; }
//静态常量,在定义时初始化
public static final int STATIC_D=40;
//静态常量,在静态初始化块中初始化
public static final int STATIC_E;static{STATIC_E = 50;}
//静态变量不能在初始化块中初始化
public static final int STATIC_F;{STATIC_F=60;}
public final int G;
//静态final变量不可以在构造器中初始化
//public static final int STATIC_H;
//在构造器中初始化
public finalTest(){
G=70;
//静态final变量不可以在构造器中初始化
//STATIC_H=80;
//给final的变量第二次赋值时,编译会报错
//A=99;
//STATIC_D=99;
}
//final变量未被初始化,编译时就会报错
//public final int L;
//静态final变量未被初始化,编译时就会报错
//public static final int STATIC_J;
}
final修饰数组,可以更改数组里的内容
结论:final固定的是一个地址。
public class Person {
static final int a = 10;
static final int[] arr = {1,2,3};
public static void main(String[] args) {
int[] brr = {4,5,6};
arr = brr; //final定义的变量arr不能指向brr的空间
arr[1] = 4; //final定义的变量arr内部的值是可以改变的
a = 3; //final定义的基本数据类型的变量是不能被改变的
}
}
2.变量还可以分为局部变量和全局变量
public class Person {
static final int a = 10;
static final int b ;
public static void main(String[] args) {
final int c = 10;
final int d;
System.out.println(c);
System.out.println(d); //
}
}
我们可以得出以下结论final修饰全局变量必须提前赋值,final修饰局部变量可以先声明在赋值,但要想使用必须赋值
结论:final只能赋值一次,不可以重新赋值
-
final修饰方法
- 不能被重写
public class Person {
public final void run(){
System.out.println("人能跑。。。。");
}
}
class Student extends Person{
public void run(){
}
public static void main(String[] args) {
}
}