Java-final
final关键字
final:最终的 不能改变的
final可以用来修饰的结构:类、方法、变量。
static final 用来修饰属性:全局常量。
final修饰类
此类不能被其他类所继承。
比如:String类、System类、StringBuffer类。
final class Hoo{
}
//class Ioo extends Hoo{} //编译错误,final的类不能被继承
class Joo{}
final class Koo extends Joo{} //正确,不能当老爸,但能当儿子
final修饰方法
表明此方法不可以被重写。
比如:Object类中getClass()。
class Foo{
void show(){}
final void test(){}
}
class Goo extends Foo{
void show(){}
//void test(){} //编译错误,final修饰的方法,不能被重写
}
final修饰变量(成员变量和局部变量)
变量分为成员变量和局部变量,他们被final修饰时有不同的注意事项。
(1) final修饰成员变量:该成员变量必须在其所在类对象创建之前被初始化(且只能被初始化一次)。
所以当我们在定义被final修饰的成员变量时 该成员变量必须在其所在类对象创建之前被初始化 这种初始化的方法有三种
1).直接初始化(赋值)
public class Demo{
private final int a = 5;
public static void main(String[] args) {
}
}
2).构造代码块中将其初始化(赋值)
构造代码块会在类对象构造方法之前执行(即创建对象前执行)
public class Demo{
//被final修饰的成员变量 在其类对象创建之前必须完成初始化
private final int a;
//在构造代码块中为a赋值
//构造代码块会在该类对象创建之前执行
{
a = 5;
}
public static void main(String[] srgs){
}
}
3).在成员变量所在类的构造方法将其初始化(赋值)
public class Demo{
//被final修饰的成员变量 在其类对象创建之前必须完成初始化
private final int a;
//带参数的构造方法 在构造方法中被final修饰的成员变量初始化
public Demo2(int b){
this.a = b;
}
public static void main(string[] args){
}
}
3.1).final修饰局部变量:该变量必须在使用之前赋值 且只能赋值一次
public class Demo{
public static void main(String[] args){
}
public void test(){
//在test方法定义一个被final修饰的局部变量 该变量的作用域就是在test方法内
final int a;
}
}
static final常量:应用率高
- 必须声明同时初始化
- 由类名打点来访问,不能被改变
- 建议:常量所有字母都大写,多个单词用_分隔
- 编译器在编译时会将常量直接替换为具体的数,效率高
- 何时用:数据永远不变,并且经常使用
总结:
final修饰成员变量,该变量必须在 其所在类对象 创建之前完成初始化且只能被初始化一次
final修饰局部变量,该变量在定义时可以不被初始化,但是使用之前,必须完成初始化且只能初始化一次
总而言之一句话:
final修饰的成员变量在定义时必须初始化(三种方法),final修饰的局部变量定义时可以不被初始化,但是使用之前必须完成初始化!