目录
一、final
final表示最后的,最终的,可以用于修饰类,属性,方法,局部变量。
1、当不希望类被继承时,可以用final修饰。
2、当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。
3、当不希望类的的某个属性的值被修改,可以用final修饰。
4、当不希望某个局部变量被修改,可以使用final修饰。
二、注意事项
1、final修饰的属性又叫常量,一般用XX_XX_XX的格式大写字母来命名;
2、final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一【选择一个位置赋初值即可】:①、定义时 ②、在构造器中 ③、在代码块中
class A01{
//定义时赋值
public final int NUM1 = 10;
public final int NUM2;
public final int NUM3;
//在构造器赋值
public A01() {
NUM2 = 20;
}
//在代码块赋值
{
NUM3 = 30;
}
}
3、如果final修饰的属性是静态的,则初始化的位置只能是:①、定义时②、在静态代码块,不能在构造器中赋值。
4、final类不能继承,但是可以实例化对象。
public class TestFinal02 {
public static void main(String[] args) {
new A03();
}
}
final class A03{
}
5、如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。
public class TestFinal02 {
public static void main(String[] args) {
new A04().hi();
}
}
class A03{
public final void hi(){
System.out.println("静态方法被调用");
}
}
class A04 extends A03{
}
6、如果一个类已经是final类了,就没有必要再将方法修饰成final方法。
7、final不能修饰构造器。
8、final和static往往搭配使用,效率更高,不会导致类的加载,底层编译器做了优化处理。
9、包装类(Integer,Double,Float,Boolean等都是final),String也是final类。
三、相关案例
请编写一个程序,能够计算圆形的面积。要求圆周率为3.14.赋值的位置3个方式都写一下。
public class TestFinal03 {
public static void main(String[] args) {
double v = new Circle(3).calArea();
System.out.println("面积是:"+v);
}
}
class Circle{
private double radius;
private final double PI; //= 3.14;
public Circle(double radius) {
this.radius = radius;
//this.PI = 3.14;
}
{
PI = 3.14;
}
public double calArea(){
return PI * radius * radius;
}
}