Final --- 最终且不可改变的
Fianl关键字常见4个用法:
1/修饰类
作用:该类不可以有子类,不可以被继承,但是该类可以继承其它类(包括默认的原生父类Object).
注意:如果有定义抽象类的’abstract’修饰符,则两者无法同时使用,因为矛盾
格式:public fianl class 类名
2/修饰方法
作用:假如有子类,该方法将不能被重写
注意:如果有定义抽象方法的’abstract’修饰符,则两者无法同时使用,因为矛盾
格式:修饰符 fianl 返回值类型 方法名(参数列表){] 列如:public fianl void fianlMethod(){}
3/修饰局部变量
作用:变量的数据内容将不能被更改,一次赋值,终生不变
注意:1/方法中的参数也算作局部变量,因此方法中的参数变量也可以修饰成final,这意味着参数变量在接收到了参数数据后,参数内容将不会被改变.
2/变量分为’基本数据类型’和’引用数据类型’,‘对象’算是一种’引用数据类型’,因此也可以修饰对象这种引用数据类型.
2/对于基本数据类型来说,’不可变’的是数据内容. 对于引用数据类型来说,’不可变’的是地址值.
格式一/单纯修饰:final 变量类型 变量名; 或 final 变量类型 变量名 = 内容;
格式二/方法参数修饰:方法名(final 参数类型 参数名){} 列如: public final void finalMethod(final int a,final int b){
格式三/修饰’引用数据类型’之一的’对象’: final 类名 对自定义对象名 = new 类名();
4/修饰成员变量
作用:一次性,不可改变
注意:1/当fianl修饰成员变量时,不能将值留空(不带fianl则可以)
2/赋值方式有二种,要么直接赋值.要么通过构造方法赋值,二者必须选其一,不能共用!
3/如果使用构造方法赋值,那么所有的构造方法都必须对具有final属性的成员变量赋值,少一个都不行.
而仅仅一个构造方法对其进行赋值的话,那么就会报错.
public class Demo01Final {
//==========final修饰时,成员变量直接赋值
// private final String fianlString; × final做修饰符时,不可以留空值,需要直接赋值
private final String fianlString; //√
//=========final修饰时,通过构造方法赋值
public Demo01Final() {
this.fianlString = "13"; //如果使用构造方法,必须保证所有构造方法都对fianl成员变量进行赋值.
System.out.println(this.fianlString);
}
public Demo01Final(String fianlString) {
this.fianlString = fianlString;
System.out.println(this.fianlString);
}
public String getFianlString() {
return fianlString;
}
public static void main(String[] args) {
System.out.println();
finalMethod(12,21);
//=========================================================对于 基本数据类型来说,'不可变'的是{数据内容}=============================================
//Final 变量
//对于 基本数据类型 来说,'不可变'的是 {数据内容}
final int finalVariable = 12;
//=============================================对于 引用数据类型 来说,'不可变'的是 {内存地址值}==============================================
//普通定义一个对象 对其类的构造传递参数
finalObjectTest commonlObj = new finalObjectTest("中国"); //此时内存分配了一个地址值
System.out.println(commonlObj.getAnimalName()); //中国
System.out.println(commonlObj); //输出对象地址值 code.study.day11.Demo01.finalObjectTest@3f3afe78
//通过此前创造的对象'commonObj',为其对应的构造传递一个新参数
commonlObj = new finalObjectTest("中国"); //尽管参数内容相同.但这属于新传递的参数,因此此时内存分配了一个新的地址值
System.out.println(commonlObj.getAnimalName()); //中国
System.out.println(commonlObj); //输出对象地址值 code.study.day11.Demo01.finalObjectTest@7f63425a
//用'final'关键字定义一个对象 并给其构造传递参数
final finalObjectTest finalObj = new finalObjectTest("究极"); //分配了一个内存地址
System.out.println(finalObj.getAnimalName()); //究极
System.out.println(finalObj);// 内存地址 code.study.day11.Demo01.finalObjectTest@36d64342
// finalObj = new finalObjectTest("究极"); //× 不可以传递新的参数!尽管参数内容一致,但是地址值会是新的,而final对于引用数据来说,是不可以改变内存地址的!
}
//=================================================fianl方法相关==============================================
// 1/final定义的方法属性
// 2/final定义的参数变量属性
public static final void finalMethod(final int a,final int b){
System.out.println(a+b);
// a = 12; //不可被二次赋值更改的参数. 错误!
}
}