final关键字可以修饰域,也可以修饰方法,还可以修饰类
final修饰的域为最终域。修饰域的形式为:
[访问修饰符] [static] final 数据类型 域名 =值;
final域在定义时必须给出 “值”,不能用默认值。
final修饰的域可以看成符号常量。因为这个域所在类的所有对象有完全相同的值,所有将其声明为类域(static)比较合适;又因为这个域值在运行过程中不能改变,所以将其声明为public,以便通过类名或对象名直接访问。
final修饰的方法为最终方法。修饰形式为:
[访问修饰符] [static] final 方法类型 方法名([形参列表]){
//方法体
}
final修饰的方法可以被子类继承,但是不能被重写,如果类在中的方法比较重要,不希望被重写,可以声明为final。
public static void main(String[] args) {
B obj=new B();
obj.PI=2.212;
System.out.println(obj.getA());
}
class A{
//符号常量,最终域
public static final double PI=3.1415926;
int a=10;
//最终方法
public final int getA(){
return a;
}
}
class B extends A{
int b=-15;
public B(){
//PI被final修饰,不能被重写
PI=2.7541;
}
public int getA(){ //getA()方法被final修饰,不能被重写
return b;
}
}
结果:
类名或对象名直接访问:
public static void main(String[] args) {
B obj=new B();
System.out.println(A.PI); //通过类名调用
System.out.println(obj.getA()); //通过对象名调用
}
class A{
//符号常量,最终域
public static final double PI=3.1415926;
int a=10;
//最终方法
public final int getA(){
return a;
}
}
class B extends A{
int b=-15;
public B(){
}
}
结果:
final修饰的属性又叫常量,一般用XX_XX_XX来命名;在定义时必须赋值,并且以后不能再修改,赋值可以加在如下位置:
①定义时:如public final double TAX_RA=0.08;
②在构造器中
③在代码块中
class A{
//符号常量,最终域
public final double PI=3.1415926;
public final double a;
public final double b;
public A(){ //在构造器中
a=2;
}
//在代码块中
{
b=3;
}
}
如果final修饰的属性是静态的(static),则初始化的位置只能在
①定义时
②静态代码块中,不能在构造器赋值
被构造器赋值的a报错。
注:
final类不能为继承,但是可以实例化对象
如果类不是final类,但是有final对象,则该方法可以被继承,但是不能被重写。
一般来说,如果一个类被final修饰了,就没必要将方法修饰为final方法。
final不能修饰构造器。
final和static搭配使用,效率会更高。
包装类(Integer,Double,Float,Boolean等都是final),String也是final类。