java 中 final 关键字的用法

2016-02-23 17:00:43   最后更新: 2016-02-24 01:14:25   访问数量:668




final 是 java 的重要关键字之一,可以用来修饰类、方法和变量,主要用来表示“不可改变”

 

final 类不能被继承,同时,一旦用 final 修饰了类,也就意味着 final 类中的所有方法都被隐式地指定为 final 方法

 

在类继承的过程中,对于父类中的 final 方法,子类不能修改和覆盖

private 方法都被隐式指定为 final 方法

 

有两个原因使用 final 方法:

  1. 锁定方法,防止被子类修改其含义
  2. 在早期的 java 实现版本中,final 方法被实现为内嵌调用,可以提升性能

 

final 关键字用来修饰变量是最常用的用法,如果修饰成员变量,则必须在定义时或者构造方法中初始化,且一经初始化此后不能再进行任何赋值

针对基本类型和类对象有着不同的含义:

  1. 对于基本类型,final 变量一经初始化,此后不能再改变该变量的值
  2. 对于类对象,已经初始化后,不能让这个变量再指向另一个对象,但他指向的对象的内容是可以改变的

 

static final 域称为编译期常量,一般全部大写

 

class Glyph { void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph { private int redius = 1; RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { System.out.println("RoundGlyph.draw(), radius = " + radius); } } public class RolyConstructors { public static void main(String[] args) { new RoundGlyph(5); } }

 

 

输出结果:

Glyph() before draw()

RoundGlyph.draw(), radius = 0

Glyph() after draw()

RoundGlyph.RoundGlyph(), radius = 5

 

上面的代码展示了类初始化过程以及隐藏的灾难性问题

main 函数中以参数 5 调用 RoundGlyph 的构造函数创建了 RoundGlyph 对象,在 RoundGlyph 构造方法执行前调用了其父类 Glyph 的构造方法

然而,在父类 Glyph 的构造方法中调用了 draw 方法,由于多态性,此时实际上调用了子类的 draw 方法,然而子类的 redius 此时还没有通过构造器初始化,因此输出了:

RoundGlyph.draw(), radius = 0

 

这显然不是我们想要的结果,因此需要注意:

  • 用尽可能简单的方法初始化类成员
  • 在构造器中最好只调用 final 方法

 

第二条的原因是 final 不会应用多态性,因此可以保证调用的是当前对象的相应方法,而不是初始化工作还没有进行的子类的覆盖方法

 






技术帖      龙潭书斋            class      java      对象      thinking in java      final      关键字      成员变量     


京ICP备15018585号