资料内容:
final、finally 和 finalize 我相信在座的各位都是资深程序员,final 这种基础关键字就不用多说了。不过,还是要照顾一下小白读 者,毕竟我们都是从小白走过来的嘛。 final 修饰类、属性和方法 final 可以用来修饰类,final 修饰的类不允许其他类继承,也就是说,final 修饰的类是独一无二的。 如下所示 我们首先定义了一个 FinalUsage 类,它使用 final 修饰,同时我们又定义了一个 FinalUsageExtend 类,它想要 继承(extend) FinalUsage,我们如上继承后,编译器不让我们这么玩儿,它提示我们 不能 从 FinalUsage 类继承,为什么呢?不用管,这是 Java 的约定,有一些为什么没有必要,遵守就行。 final 可以用来修饰方法,final 修饰的方法不允许被重写,我们先演示一下不用 final 关键字修饰的情 况 如上图所示,我们使用 FinalUsageExtend 类继承了 FinalUsage 类,并提供了 writeArticle 方法的重 写。这样编译是没有问题的,重写的关键点是 @Override 注解和方法修饰符、名称、返回值的一致性。 注意:很多程序员在重写方法的时候都会忽略 @Override,这样其实无疑增加了代码阅读的难度, 不建议这样。 当我们使用 final 修饰方法后,这个方法则不能被重写,如下所示 当我们把 writeArticle 方法声明为 void 后,重写的方法会报错,无法重写 writeArticle 方法。 final 可以修饰变量,final 修饰的变量一经定义后就不能被修改,如下所示 编译器提示的错误正是不能继承一个被 final 修饰的类。 我们上面使用的是字符串 String ,String 默认就是 final 的,其实用不用 final 修饰意义不大,因为字符 串本来就不能被改写,这并不能说明问题。 我们改写一下,使用基本数据类型来演示 同样的可以看到,编译器仍然给出了 age 不能被改写的提示,由此可以证明,final 修饰的变量不能被重 写。 在 Java 中不仅仅只有基本数据类型,还有引用数据类型,那么引用类型被 final 修饰后会如何呢?我们 看一下下面的代码 首先构造一个 Person 类 public class Person { int id; String name; get() and set() ... toString()... } 然后我们定义一个 final 的 Person 变量。 static final Person person = new Person(25,"cxuan"); public static void main(String[] args) { System.out.println(person); person.setId(26); person.setName("cxuan001"); System.out.println(person); } 输出一下,你会发现一个奇怪的现象,为什么我们明明改了 person 中的 id 和 name ,编译器却没有报 错呢? 这是因为,final 修饰的引用类型,只是保证对象的引用不会改变。对象内部的数据可以改变。这就涉及 到对象在内存中的分配问题,我们后面再说。