final修饰变量
final修饰的变量即成为常量,只能赋值一次,但是final所修饰局部变量和成员变量有所不同。
final修饰的局部变量必须使用之前被赋值一次才能使用。
final修饰的成员变量在声明时没有赋值的叫“空白final变量”。空白final变量必须在构造方法或静 态代码块中初始化。
final修饰变量示例代码如下:
public class FinalDemo { // final修饰的全局变量在声明时赋值即成为常量 final int a = 5; // 空白final变量 final int b; // 静态常量 final static int c = 12; // 空白final变量 final static int d; // 静态代码块 static { d = 10; } // 构造方法 public FinalDemo(int b) { this.b = b; } // 成员方法 void doSomething(){ // final修饰局部变量 final int e = 100; System.out.println(e); } } class FinalDemoTest{ public static void main(String[] args) { // 创建对象 FinalDemo finalDemo = new FinalDemo(6); System.out.println(finalDemo.b); finalDemo.doSomething(); System.out.println(FinalDemo.d); } }
运行结果:
6 100 10
final修饰类
final修饰的类不能被继承。有时出于设计安全的目的,这时可以使 用final关键字修饰父类。
示例代码如下:
final class SuperClass { } class SubClass extends SuperClass { //编译错误 }
在声明SubClass类时会发生编译错误。
final修饰方法
final修饰的方法不能被子类重写。有时也是出于设计安全的目的,这 是可以使用final关键字修饰父类中方法。
class SuperClass { final void doSomething() { System.out.println("in SuperClass.doSomething()"); } } class SubClass extends SuperClass { @Override void doSomething() { //编译错误 System.out.println("in SubClass.doSomething()"); } }
子类中的void doSomething()方法试图重写父类中void doSomething()方法,父类中的void doSomething() 方法是final的,因此会发生编译错误。