Java的final关键字
基本介绍:
final(译最后的,最终的) 可以修饰类,属性,方法和局部变量
在某些情况下,程序员可能有以下需求,就会用到final:
1)当不希望类被继承时,可以用final修饰
2)当不希望父类某个方法被子类覆盖/重写时,可以用final关键字修饰
3)当不希望类的某个属性的值被修改,可以用final修饰
4)当不希望某个局部变量被修改,可以用final修饰.
package com.final_;public class Final01 {public static void main(String[] args) {E e = new E();e.TAX_RAT = 0.09;}
}//如果不希望A被其他类继承,用final修饰即可
// final class A{
// }
class A{
}
class B extends A{
}//当不希望父类某个方法被子类覆盖/重写时,可以用final关键字修饰
class C{public void hi(){//如果要求不允许子类重写,可以写final public void hi(){}}
}
class D extends C{@Overridepublic void hi() {System.out.println("重写了C类的hi()");}
}//当不希望类的某个属性的值被修改,可以用final修饰
class E {public double TAX_RAT = 0.08;//final public double TAX_RAT = 0.08;
}//当不希望某个局部变量被修改,可以用final修饰.
class F{public void cry(){double NUM = 0.01;NUM = 0.02;//final double num = 0.01;//这时,num也被称为局部常量(不允许变化的值一般为大写)}
}
final使用注意事项和细节讨论:
1)final修饰的属性又叫常量,一般用 xx_xx_xx来命名 (字母一般大写,如TAX_RATE)
2)final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一(选择一个位置赋初值即可)
1.定义时,如public final double TAX_RATE = 0.08;(final写前面也行)
2.在构造器中
3.在代码块中
3)如果final修饰时的属性是静态的,则初始化的位置只能是
1.定义时
2.在静态代码块 不能在构造器中赋值
4)final类不能继承,但是可以实例化对象
5)如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承
6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法
7)final不能修饰构造方法(即构造器)
8)final和static往往搭配使用,效率更高,底层编译器做了优化处理
9)包装类(Integer,double,float,boolean等都是final),String也是final类
package com.final_;public class FinalDetail01 {public static void main(String[] args) {CC cc = new DD();cc.cal();System.out.println(EE.num);}
}class AA{/*final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一(选择一个位置赋初值即可)1.定义时,如public final double TAX_RATE = 0.08;(final写前面也行)2.在构造器中3.在代码块中*/public final double TAX_RATE = 0.08;//定义时赋值public final double TAX_RATE2;//定义时未赋值则必须在下面构造器或代码块中中赋值public final double TAX_RATE3;public AA() {TAX_RATE2 = 1.1;}{TAX_RATE3 = 2.2;}
}class BB{/*如果final修饰时的属性是静态的,则初始化的位置只能是1.定义时2.在静态代码块 不能在构造器中赋值*/public static final double TAX_RATE = 99.9;//定义时赋值public static final double TAX_RATE2;//在静态代码块中赋值 不能在构造器中赋值static{TAX_RATE2 = 99;}//构造器在创建对象后才被调用,而静态成员在类加载时就被初始化,所以无法写入构造器中
}class CC{//如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承public final void cal(){System.out.println("cal()方法");}
}
class DD extends CC{//不能重写cal(),但是可以继承这个方法//在main()中创建DD对象后调用
}class EE{//final和static往往搭配使用,效率更高,底层编译器做了优化处理public static final int num = 100;static{System.out.println("BBB静态代码块被执行");//不会输出}//当final和static同时被使用,系统会只加载public static final int num = 100;//也就是说,可以直接调用静态属性而不会加载下面的静态代码块,这就是底层编译器的优化
}