Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)

上传人:宝路 文档编号:23263301 上传时间:2017-11-30 格式:DOC 页数:9 大小:83.01KB
返回 下载 相关 举报
Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)_第1页
第1页 / 共9页
Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)_第2页
第2页 / 共9页
Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)_第3页
第3页 / 共9页
Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)_第4页
第4页 / 共9页
Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)》由会员分享,可在线阅读,更多相关《Java中final、finally、finalize的简单区别中等区别详细区别(Lawliet修改注释版)(9页珍藏版)》请在金锄头文库上搜索。

1、简单区别: 中等区别:虽然这三个单词在 Java 中都存在,但是并没有太多关联:final:java 中的关键字,修饰符。1.如果一个类被声明为 final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为 absrtact 抽象类的和 final 的类。2.如果将变量或者方法声明为 final,可以保证它们在使用中不被改变.2.1 被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。 2.2 被声明 final 的方法只能使用,不能重载。finally:java 的一种异常处理机制。finally 是对 Java 异常处理模型

2、的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的 close()方法放到 finally 中,就会大大降低程序出错的几率。finalize:Java 中的一个方法名。Java 技术使用 finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize()方法以整理系统资源或者执行其他清理工作

3、。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。详细区别:这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和 finalize 虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。这一次我们就一起来回顾一下这方面的知识。1.final 关键字我们首先来说说 final。它可以用于以下四个地方:1. 定义变量,包括静态的和非静态的。2. 定义方法的参数。3. 定义方法。4. 定义类。我们依次来回顾一下每种情况下 final 的作用。1.1 定义变量,包括静态的和非静态的。定义方法的参数第一种情况:如果 final

4、 修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;如果 final 修饰的是一个对象,就表示这个变量被赋予的引用是不可变的这里需要提醒大家注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。第二种情况:final 的含义与第一种情况相同。实际上对于前两种情况,有一种更贴切的表述 final 的含义的描述,那就是,如果一个变量或方法参数被final 修饰,就表示它只能被赋值一次,但是 JAVA 虚拟机为变量设定的默认值不记作一次赋值。被 final 修饰的变量必须被初始化。初始化的方式有以下几种:1. 在定义的时候初始化。2. final 变量可以在

5、初始化块中初始化,不可以在静态初始化块中初始化。3. 静态 final 变量可以在静态初始化块中初始化,不可以在初始化块中初始化。4. final 变量还可以在类的构造器中初始化,但是静态 final 变量不可以。通过下面的代码可以验证以上的观点:Java 代码public class FinalTest / 在定义时初始化public final int A = 10; / 在初始化块中初始化public final int B;B = 20;/ 非静态 final 变量不能在静态初始化块中初始化/ public final int C;/ static / C = 30;/ / 静态常量,

6、在定义时初始化public static final int STATIC_D = 40;/ 静态常量,在静态初始化块中初始化public static final int STATIC_E;static STATIC_E = 50;/ 静态变量不能在初始化块中初始化/ public static final int STATIC_F;/ / STATIC_F = 60;/ public final int G;/ 静态 final 变量不可以在构造器中初始化/ public static final int STATIC_H;/ 在构造器中初始化public FinalTest() G =

7、70;/ 静态 final 变量不可以在构造器中初始化/ STATIC_H = 80;/ 给 final 的变量第二次赋值时,编译会报错/ A = 99;/ STATIC_D = 99;/ final 变量未被初始化,编译时就会报错/ public final int I;/ 静态 final 变量未被初始化,编译时就会报错/ public static final int STATIC_J;我们运行上面的代码之后出了可以发现 final 变量(常量)和静态 final 变量(静态常量)未被初始化时,编译会报错。用 final 修饰的变量(常量)比非 final 的变量(普通变量)拥有更高的效

8、率,因此我们在实际编程中应该尽可能多的用常量来代替普通变量,这也是一个很好的编程习惯。1.2 定义方法当 final 用来定义一个方法时,会有什么效果呢?正如大家所知,它表示这个方法不可以被子类重写,但是它这不影响它被子类继承。我们写段代码来验证一下:Java 代码public class ParentClass public final void TestFinal() System.out.println(父类-这是一个 final 方法);public class SubClass extends ParentClass /* 子类无法重写(override)父类的 final 方法,否

9、则编译时会报错*/ public void TestFinal() / System.out.println(子类-重写 final 方法);/ public static void main(String args) SubClass sc = new SubClass();sc.TestFinal();这里需要特殊说明的是,具有 private 访问权限的方法也可以增加 final 修饰,但是由于子类无法继承 private 方法,因此也无法重写它。编译器在处理 private 方法时,是按照 final 方法来对待的,这样可以提高该方法被调用时的效率。不过子类仍然可以定义同父类中的pri

10、vate 方法具有同样结构的方法,但是这并不会产生重写的效果,而且它们之间也不存在必然联系。1.3 定义类最后我们再来回顾一下 final 用于类的情况。这个大家应该也很熟悉了,因为我们最常用的 String 类就是final 的。由于 final 类不允许被继承,编译器在处理时把它的 所有方法都当作 final 的,因此 final 类比普通类拥有更高的效率。而由关键字 abstract 定义的抽象类含有必须由继承自它的子类重载实现的抽象方法,因此无法同时用 final 和 abstract 来修饰同一个类。同样的道理,final 也不能用来修饰接口。 final 的类的所有方法都不能被重写

11、,但这并不表示 final 的类的属性(变量)值也是不可改变的,要想做到 final 类的属性值 不可改变,必须给它增加 final 修饰,请看下面的例子:Java 代码public final class FinalTest int i = 10;final int j = 50;public static void main(String args) FinalTest ft = new FinalTest();ft.i = 99; / final 类 FinalTest 的属性值 i 是可以改变的,因为属性值 i 前面没有final 修/ ft.j = 49; / 报错.因为 j 属性是

12、 final 的不可以改变。System.out.println(ft.i);运行上面的代码试试看,结果是 99,而不是初始化时的 10。2.finally 语句接下来我们一起回顾一下 finally 的用法。这个就比较简单了,它只能用在 try/catch 语句中,并且附带着一个语句块,表示这段语句最终总是被执行。请看下面的代码:Java 代码public final class FinallyTest public static void main(String args) try throw new NullPointerException(); catch (NullPointerEx

13、ception e) System.out.println(程序抛出了异常); finally /这里总会被执行,不受 break,return 影响另如数据库连接的 close()一般写在这里,可以降低程序的出错几率System.out.println(执行了 finally 语句块); 运行结果说明了 finally 的作用:1. 程序抛出了异常2. 执行了 finally 语句块请大家注意,捕获程序抛出的异常之后,既不加处理,也不继续向上抛出异常,并不是良好的编程习惯,它掩盖了程序执行中发生的错误,这里只是方便演示,请不要学习。那么,有没有一种情况使 finally 语句块得不到执行呢?

14、大家可能想到了return、continue、break 这三个可以打乱代码顺序执行语句的规律。那我们就来试试看,这三个语句是否能影响 finally 语句块的执行:Java 代码public final class FinallyTest / 测试 return 语句结果显示:编译器在编译 return new ReturnClass();时,将它分成了两个步骤,new ReturnClass()和 return,前一个创建对象的语句是在 finally 语句块之前被执行的,而后一个 return 语句是在 finally 语句块之后执行的,也就是说 finally 语句块是在程序退出方法之

15、前被执行的public ReturnClass testReturn() try return new ReturnClass(); catch (Exception e) e.printStackTrace(); finally System.out.println(执行了 finally 语句);return null;/ 测试 continue 语句public void testContinue() for (int i = 0; i 3; i+) try System.out.println(i);if (i = 1) continue; catch (Exception e) e.printStackTrace(); finally System.out.println(执行了 finally 语句);/ 测试 break 语句public void testBreak() for (int i = 0; i 3; i+) try System.out.println(i);if (i = 1) break; catch (Exception e) e.printStackTrace(); finally System.out.println(执行了 finally 语句);public static void main(String

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号