final 最终
当在描述事物时,一些数据的出现值时固定的,那么这时为了增强阅读性,都给这些值起个名字,方便于阅读。
而这个值不需要改变,所以加上final修饰,作为常量(常量的书写规范为所有字母都大写,如果由多个单词组成,单词间用_来连接)。
※ final具有”不可改变的”含义,它可以修饰非抽象类、非抽象成员方法和变量。
. 用final修饰的类不能被继承,没有子类;
. 用final修饰的方法不能被子类的方法覆盖;
. 用final修饰的变量表示常量,只能被赋一次值;
. 既可以修饰成员变量也可以修饰局部变量
※ final不能用来修饰构造方法。
因为”方法覆盖”这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系. 因此用final修饰构造方法是无意义的。父类中用private修饰的方法不能被子类的方法覆盖,因此private类型的方法默认是final类型的。
※ final类
final修饰的类不能被继承。
除此之外正常使用
继承关系的弱点是打破封装,子类能够访问父类的方法,而且能以方法覆盖的方式修改实现细节。在以下情况下,
可以考虑把类定义为final类型,使得这个类不能被继承。
. 子类有可能会错误地修改父类的实现细节;
. 出于安全,类的实现细节不允许有任何改动;
. 在创建对象模型时,确信这个类不会再被扩展;
例如JDK中java.lang.String类被定义为final类型;
※ final方法;
某些情况下,出于安全原因,父类不允许子类覆盖某个方法, 此时可以把这个方法声明为final类型。例如在
java.lang.Object类中,getClass()方法为final类型。
final修饰方法,表示最终的方法,不能被重写
如果类已经用final修饰,里面的方法可以不用
3. final变量:
final修饰的属性(成员变量)赋值的位置:
非静态的成员变量
1.声明的同时
2.匿名代码块
3.构造器(类中出现的所有构造器)
静态的成员变量
1.声明的同时
2.static代码块
a. final可以修饰静态变量、实例变量、局部变量;
b. final变量都必须显示初始化,否则会导致编译错误;
1) 静态变量,定义变量时进行初始化或者static代码块中赋值;
2) 实例变量,可以在定义变量时,或者在构造方法中进行初始化;
c. final变量只能赋一次值。
d.对全局的final变量赋值的位置
1.直接变量后面赋予值
2.匿名代码块赋值
3.构造器也可以赋值,赋值以后不能修改
e.final修饰的局部变量要赋予具体值,表示最终的变量
public class Sample {
private final int var1 = 1;
public Sample() {
//编译出错,不允许改变var1实例变量的值;
var1 = 2;
}
public void method(final int param) {
final int var2 = 1;
//编译出错,不允许改变var2局部常量的值
var2++;
//编译出错,不允许改变final类型参数的值;
param++;
}
}
public class Sample {
//定义var1实例常量
final int var1;
//定义并初始化var2实例常量
final int var2 = 0;
Sample() {
//初始化var1实例常量
var1 = 1;
}
Sample(int x) {
//初始化var1实例常量
var1 = x;
}
}