l final修饰符
final成员变量:
但是不能在普通方法中为final修饰的成员变量赋值。
final局部变量:
final修饰局部变量与修饰成员变量类似,只是局部变量只能在方法中赋值,注意:形式参数(形参列表)也是局部变量只是这个形参只是接收参数。
·final修饰的变量就会变成只读变量。final修饰的引用变量的值也不能改变,但是可以改变引用变量指向的对象可以改变(比如数组的某个元素)。
·宏变量:final修饰符的一个重要用途就是定义“宏变量”,宏变量就是相当于一个直接量!只要满足3个条件fianl就不再是变量,而是相当于一个直接量。
1、使用final修饰的变量或成员变量
2、对于实例属性来说,只要在定义final属性时同时初始化这个属性,该属性才会成为宏变量。
3、初始值是在编译期就能确定下来的。
·如果final修饰的变量值中是常量,且有基本的算术表达式,或者连接运算符(+),没有访问普通变量(就是没有用final修饰的普通变量),和调用方法,那么这个变量也是“宏变量”
例子:宏变量
public class Te
{
public static void main(String[] args)
{
String s1 = "ab";
String s2 = "a" + "b";
final int = 1 / 2; //这个是宏变量,变量就相当于直接量
System.out.println(s1 == s2); //结果是true
final String sa = "a"; //这个是宏变量,变量就相当于直接量
final String sb = "b"; //这个是宏变量,变量就相当于直接量
String sc = sa + sb;
System.out.println(sc == s1); //结果是true
}
}
·final方法
fianl修饰的方法不能被重写,但是可以被重载。被private修饰的方法不存在继承,所以不存在重写一说。
例子:final方法
class FMS
{
//① public final void finalnowrite(){}
//② private final void finalnowrite(){}
}
public class FinalMeth extends FMS
{
//a public void finalnowrite(){}
//b public void finalnowrite(){}
public final void finalnowrite(){} //④
public void finalnowrite(String a) //⑤
{
System.out.println(a);
}
public static void main(String[] args)
{
FinalMeth f = new FinalMeth();
f.finalnowrite("a");
}
}
//① 和 a是重写关系,a重写① 但是由于① 是final修饰的所以不能重写,会报错。
//② 和 b不是重写关系,因为② 是private修饰的所以只在FMS类中可见,不存在继承,所以就没有重写一说。
//④ 和⑤ 是重载关系,final修饰的方法可以重载。
·final修饰的类不能被子类继承
子类通过重写父类的方法来改变父类方法的实现细节,为了遏制这个不安全因素可以使用final禁止子类继承父类。