思维导图:
final是Java当中一个重要的关键字,可以修饰类,方法,变量(成员变量,局部变量,引用变量)final关键字的核心含义是 ''最终的'' ''不可改变的''。通过使用final关键字,我们能够有效地防止代码被意外修改,增强程序的健壮性和可维护性。
一.final修饰类
当final关键字用于修饰类时,这个类就被称为最终类。最终类不能被继承,也就是说,其他类无法扩展该类的功能。这种限制的主要目的是确保类的行为和结构的完整性,防止子类对其进行不必要的修改。
例如:Java 标准库中的String类就是一个final类:如下图所示
解释:String类被设计为final类,是因为字符串在 Java 编程中使用极为频繁,并且需要保证其不可变性。如果String类可以被继承,那么可能会出现子类破坏其不可变特性的情况,从而引发各种难以预料的问题。比如,假设String类不是final类,子类可能会重写一些关键方法,使得原本依赖String不可变性的代码逻辑出现错误。
二.final修饰方法
当final关键字用于修饰方法时,该方法被称为最终方法。最终方法不能被子类重写。这种机制可以确保父类中的某些方法的行为在子类中保持一致,防止子类对其进行不当的修改。
代码示例:
class ParentClass {final void finalMethod() {System.out.println("final修饰的方法");}
}class ChildClass extends ParentClass {// 尝试重写finalMethod会导致编译错误// void finalMethod() { // System.out.println("重写父类final修饰的方法"); // }
}
在实际开发中,当父类中的某个方法已经实现了完整且正确的逻辑,并且不希望子类对其进行修改时,就可以将该方法声明为final。比如,在一个图形绘制类库中,父类Shape中有一个draw方法用于绘制图形,这个方法的实现逻辑已经涵盖了所有图形绘制的基本操作,为了保证绘制逻辑的一致性和正确性,我们可以将draw方法声明为final,防止子类意外重写导致绘制错误。
三、final 修饰变量
final关键字修饰变量时,该变量被称为常量,一旦被赋值就不能再被重新赋值。根据变量的类型(成员变量或局部变量)以及赋值的时机,final变量的使用方式有所不同。
3.1 final 修饰成员变量
使用final修饰的成员变量必须在声明时或构造函数中进行初始化。例如:
class FinalVariableExample {final int constantValue = 10; // 在声明时初始化final String name;FinalVariableExample(String name) {this.name = name; // 在构造函数中初始化}
}
如果在声明final成员变量时没有初始化,并且在构造函数中也没有对其进行赋值,将会导致编译错误。此外,需要注意的是,对于final成员变量,在不同的构造函数中赋值必须保证其值的一致性,否则会造成逻辑混乱。
3.2 final 修饰局部变量
final修饰的局部变量也必须在使用前进行赋值,并且只能赋值一次。例如:
public class FinalLocalVariable {public static void main(String[] args) {final int localVar;localVar = 20;// localVar = 30; // 编译错误,final变量不能重新赋值System.out.println(localVar);}
}
在实际编程中,final局部变量常用于表示一些不会改变的值,比如在计算圆的面积时,圆周率π就可以定义为final局部变量,以保证其值在整个计算过程中保持不变,避免因意外修改导致计算错误
此外,当final关键字用于修饰引用类型变量时,它表示该引用变量不能再指向其他对象,但对象本身的状态是可以改变的。例如:
class Person {String name;Person(String name) {this.name = name;}
}public class FinalReferenceVariable {public static void main(String[] args) {final Person person = new Person("Alice");// person = new Person("Bob"); // 编译错误,不能重新赋值引用person.name = "Eve"; // 可以修改对象的属性System.out.println("Person's name: " + person.name);}
}
小结:
final关键字在 Java 中是一个非常重要的修饰符,它通过限制类的继承、方法的重写和变量的重新赋值,为代码提供了更高的安全性和稳定性。合理使用final关键字可以有效地避免一些潜在的编程错误,同时也有助于提高代码的可读性和可维护性。
面试参考答案:
得分点 final类,final方法,final变量
final关键字可以用来标志其修饰的类,方法和变量不可变。 当final修饰类时,该类不能被继承,例如java.lang.Math类就是一个final类,它不能被继承。 final修饰的方法不能被重写,如果出于某些原因你不希望子类重写父类的某个方法,就可以用final关键字修饰这个方法。 当final用来修饰变量时,代表该变量不可被改变,一旦获得了初始值,该final变量的值就不能被重新赋值。 final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。
加分回答: 对于final修饰的成员变量而言,一旦有了初始值就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也没有在初始化块,构造方法中为成员变量指定初始值此时会编译出错 以Java语法规定:final修饰的成员变量必须由程序员显示的指定初始值。义final修饰的实例变量,要么在定该实例变量时指定初始值,要么在普通初始化块或构造方法中为该实例变量指定初始值。但要注意的是,如果普通初始化块已经为某个实例变量指定了初始值,则不能再在构造方法中为该实例变量指定初始值;final修饰的类变量(静态变量),要么在定义该变量时指定初始值,要么在静态初始化块中为该类变量指定初始值。 实例变量不能在静态初始化块中指定初始值,因为静态初始化块是静态成员,不可以访问实例变量;类变量不能在普通初始化块中指定初始值,因为类变量在类初始化阶段已经被初始化了,普通的初始化块不能为其重新赋值。 系统不会为局部变量进行初始化,所以局部变量必须由程序员显示的初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。如果final修饰的局部变量在定义是没有指定默认值,则可以在后面的代码中对该final变量赋初始值,但只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。