基本介绍
需要用到final的需求如下:
1)当不希望类被继承时,可以用final修饰类;
final class A {}
//class B extends A {} 错误,因为A类使用final修饰,B类无法继承A类
2)当不希望父类的某个方法被子类覆盖/重写时,可以用final修饰方法;
class A {
public final void hi(){}
}
class B extends A {
//public void hi(){} 错误,父类使用final修饰hi()方法,子类无法重写
}
3)当不希望类的某个属性的值被修改时,可以用final修饰属性;
public class Test {
public static void main(String[] args){
A a = new A();
//a.TAX_RATE = 2; 错误,属性使用final修饰,无法再次对属性进行赋值
}
}
class A {
public final int TAX_RATE = 1;
}
4)当不希望某个局部变量被修改,可以使用final修饰局部变量;
class A {
public void hi(){
final double NUM = 0.01;
//NUM = 0.09; 错误,局部变量被final修饰,无法进行再次赋值
}
}
注意事项和使用细节
1)final修饰的属性又叫常量,一般采用XX_XX_XX来命名;
2)final修饰的属性在定义时,必须赋初始值,并且以后不能再修改,赋值可以在以下位置之一:
①定义时:如 public final double TAX_RATE = 0.01;
②在构造器中。
③在代码块中。
class A {
/*
*必须赋值,赋值的三种情况:
* ①在定义时
* ②在代码块中
* ③在构造器中
*/
public final double TAX_RATE = 0.01;
public final double TAX_RATE2;//虽然初始化没有赋值,但是构造器中赋值了,可以通过
public final double TAX_RATE3;//虽然初始化没有赋值,但是代码块中赋值了,可以通过
public A(){
TAX_RATE2 = 0.02;
}
{
TAX_RATE3 = 0.03;
}
}
3)如果final修饰的属性是静态的,则初始化的位置只能是①定义时 ②在静态代码块中,不能在构造器中赋值;
class A {
/*
*必须赋值,赋值的两种情况:
* ①在定义时
* ②在代码块中
*/
public static final double TAX_RATE = 11.11;
public static final double TAX_RATE2;//初始化没有赋值,在静态代码块中赋值,可以通过
//public static final double TAX_RATE3; 构造器中无法对被final修饰的静态常量进行赋值
static {
TAX_RATE2 = 22.22;
}
//public A(){ 错误,构造器中无法对被final修饰的静态常量进行赋值
// TAX_RATE2 = 33.33;
//}
}
4)final修饰的类不能被继承,但是可以实现实例化对象;
public class Test {
public static void main(String[] args){
A a = new A();
}
}
final class A { }
5)如果类不是final修饰的,但是含有final修饰的方法,则该方法不能被重写,但是类可以被继承。
public class Test {
public static void main(String[] args){
new B().hi();
}
}
class A {
public final void hi(){
System.out.println("A类的hi()方法被调用");
}
}
class B extends A { }
6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法(已经不能被继承,就不可能被重写)
7)final不能修饰构造方法(即构造器);
8)final和static往往搭配使用,效率更高,不会导致类的加载,底层编译器做了优化处理;
package com.pero.final_;
public class FinalDetail {
public static void main(String[] args) {
System.out.println(Demo.i);//使用final修饰时,输出Demo.i不会执行static代码块;
// 如果不使用final修饰,输出Demo.i时会执行static代码块
}
}
class Demo{
public final static int i = 16;
static {
System.out.println("Java课程学习");
}
}
9)包装类(Integer、Double、Float、Boolean等都是final修饰的类),String也是final修饰的类。
本文详细介绍了final关键字在Java中的应用,包括防止类继承、方法重写、属性修改以及常量设置,同时探讨了final修饰的限制和常见场景。
1154

被折叠的 条评论
为什么被折叠?



