final, finally, finalize

首先,这三个关键字没什么关联,只是放在一起比较像,用法用处完全不同。

final:

  final关键字可以用来修饰类、方法、变量(成员变量和局部变量),final用的多,下面详细介绍下

  1.1 final 修饰类

    final修饰类,表明这个类不能被继承,同时该类内的所有方法都被隐式定义为final。

  1.2 final 修饰方法

    final 修饰方法,该方法不可以被继承,不可以被重写。因此要注意,如果子类定义相同方法名和参数的函数,不是重写父类方法,是重新定义了一个新方法。

  1.3 final 修饰变量

    final修饰变量,表示只能被赋值一次,赋值后其值不再改变。

    当修饰基本数据类型时,基本数据类型的值初始化后就不会再发生变化。

    当修饰引用类型时,初始化后就不能再指向其他对象了,但是对象的值是可以变化的。引用的值本质是一个地址,因此只要地址不变,就不冲突。

    final修饰一个成员变量,必须要显式初始化。一种是声明变量时候初始化,一种是声明变量时不初始化,构造函数中对变量初始化。

finally :

  finally用于异常处理,只能用在try/catch语句中。

  关于finally要注意两点:

    1、finally不一定会执行

      有两种不会执行:a、在执行try/catch之前异常跳出。b、系统强制退出,例如:System.exit(0);

    2、finally中包含return的易错点!!在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。

    由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。

    例如:    

    public static void main(String[] args) {
int result = test();
System.out.println(result);
}
public static int test(){
try {
return 1;
} catch (Exception e) {
return 0;
}finally{
System.out.println("finally");
return 2;
}
}

      运行结果:

    

    可以知道,finally块中有return语句时,会覆盖函数中的return。

    由于java中值传递和引用传递的不同,因此,对基本类型的数据,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响

    例子:   

public static void main(String[] args) {
System.out.println(test());
System.out.println( testStr());
}
private static int test(){
int i = -1;
try {
i= 1;
return i;
} catch (Exception e) {
return i;
}finally{
i=2;
System.out.println("finally");
}
}
private static StringBuilder testStr(){
StringBuilder str = new StringBuilder("hello");
try {
return str;
} catch (Exception e) {
return null;
}finally{
str.append("world");
System.out.println("finally");
}
}

    运行结果:

    

finalize:

  finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。不需要程序员自己手动调用的。只了解,不推荐使用。

 

      

最新文章

  1. 从C#到Objective-C,循序渐进学习苹果开发(2)--Objective-C和C#的差异
  2. Linux部分命令使用记录(实时更新)
  3. WinForm------BarManager中各种属性设置
  4. git的基本操作
  5. 【源码】c#编写的安卓客户端与Windows服务器程序进行网络通信
  6. (转)android平台phonegap框架实现原理
  7. MyBatis知多少(23)MyBatis结果映射
  8. java 哪些情况下会使对象锁释放
  9. 为MYPoint类写一个分类
  10. linux驱动系列之arm汇编
  11. Centos6.4 设置开机自动以某个非root用户启动脚本
  12. Oracle SQL函数之转换函数To_char汇总
  13. 字符串分割函数Demo
  14. 新秀翻译(两)——使用Java通用配置模板方法模式
  15. orcale 之 SQL 语言基础
  16. HDU 1698 Just a Hook(线段树成段更新)
  17. 如何在GitHub上生成ssh公钥并用NetBeans克隆项目
  18. 初识Windows服务 C#
  19. Oracle expdp数据泵导出,并在文件上附加上日期格式
  20. 几行c#代码,轻松搞定一个女大学生

热门文章

  1. luogu P4631 [APIO2018] Circle selection 选圆圈
  2. node.js 设置静态文件托管
  3. Bootstrap4中栅格系统CSS中 col-sm-* col-md-* col-lg-*的意义以及当其同时具有col-xs-* col-sm-* col-md-* col-lg-*的含义
  4. vue、iview动态菜单(可折叠)
  5. 通过JNI实现java调用C代码和C代码调用java的代码
  6. 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
  7. Codeforces1238E. Keyboard Purchase(状压dp + 计算贡献)
  8. Python 输出百分比
  9. jquery 保留两位小数
  10. 破解wifi_失败