1. final
在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。1.1 修饰类
当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以
用final修饰,但要注意:
final类中所有的成员方法都会隐式的定义为final方法。1.2 修饰方法
使用final方法的原因主要有两个:
(1) 把方法锁定,以防止继承类对其进行更改。
(2) 效率,在早期的java版本中,会将final方法转为内嵌调用。但若方法过于庞大,可能在性能上不会有多大
提升。因此在最近版本中,不需要final方法进行这些优化了。final方法意味着“最后的、最终的”含义,即此方法不能被重写。注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在
子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。class A{private final void getName(){}
}public class B extends A{public void getName(){}public static void main(String[]args){System.out.println("OK");}
}1.3 修饰变量
final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于C++中的const。当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final
修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是
可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。 final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候
初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个
变量赋初值。当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该
参数的值。在java中,String被设计成final类,那为什么平时使用时,String的值可以被改变呢?字符串常量池是java堆内存中一个特殊的存储区域,当我们建立一个String对象时,假设常量池不存在该
字符串,则创建一个,若存在则直接引用已经存在的字符串。当我们对String对象值改变的时候,
例如 String a="A"; a="B" 。a是String对象的一个引用(我们这里所说的String对象其实是指字符串
常量),当a=“B”执行时,并不是原本String对象("A")发生改变,而是创建一个新的对象("B"),令a
引用它。2. finally
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终
一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。(×)(这句话其实存在一定的
问题)很多人都认为finally语句块一定会执行,但真的是这样么?答案是否定的,例如下面这个例子:只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。以上两种情况在执行try
语句块之前已经返回或抛出异常,所以try对应的finally语句并没有执行。但是,在某些情况下,即使try语句执行了,finally语句也不一定执行。例如以下情况:finally 语句块还是没有执行,为什么呢?因为我们在 try 语句块中执行了 System.exit (0) 语句,
终止了 Java 虚拟机的运行。那有人说了,在一般的 Java 应用中基本上是不会调用这个System.exit(0)
方法的。OK !没有问题,我们不调用 System.exit(0) 这个方法,那么 finally语句块就一定会执行吗?再一次让大家失望了,答案还是否定的。当一个线程在执行 try 语句块或者 catch 语句块时
被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。
还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally
语句块肯定不会执行了。可能有人认为死机、断电这些理由有些强词夺理,没有关系,我们只是为了说明
这个问题。易错点
在try-catch-finally语句中执行return语句。我们看如下代码:
首先finally语句在改代码中一定会执行,从运行结果来看,每次return的结果都是4(即finally语句),
仿佛其他return语句被屏蔽掉了。
事实也确实如此,因为finally用法特殊,所以会撤销之前的return语句,继续执行最后的finally块中的
代码。 3. finalize
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,
该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下
我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,
在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 使用finalize还需要注意一个事,调用super.finalize();一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以
有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过
一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

final、finally与finalize的区别相关推荐

  1. final,finally和finalize的区别

    final,finally和finalize的区别 一.总体区别 final       用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承. finally     是异常处理 ...

  2. final, finally, finalize 的区别

    本文转自 一.总体区别 final 用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承. finally 是异常处理语句结构中,表示总是执行的部分. finallize 表示是o ...

  3. 转 Java中final、finally、finalize的区别与用法

    Java中final.finally.finalize的区别与用法 1.简单区别: final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承. finally是异常处理语句结构 ...

  4. 【Java面试题】19 final,finally和finalize的区别

    总体区别 final       用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承. finally     是异常处理语句结构中,表示总是执行的部分. finallize   ...

  5. Android源码中final关键字的用法及final,finally,finalize的区别

    Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...

  6. Java中final、finally和finalize的区别

    final.finally.finalize的区别 1.final修饰符(关键字).被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承.因此一个类不能既被abstract声明 ...

  7. JAVA面试题解惑系列(四)——final、finally和finalize的区别

    final.finally和finalize的区别是什么? 这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影.final.finally和finalize虽然长得像孪生三兄弟 ...

  8. Java中final、finally、finalize的区别

    简单区别: final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承. finally是异常处理语句结构的一部分,表示总是执行. finalize是Object类的一个方法,在 ...

  9. final finally finalize 的区别

    1.final final修饰类,说明这个类不能被继承,是以个顶级类. final修饰变量,说明这个变量是常量. final修饰方法,表示这个方法不能被重写,不过可以冲在final方法. 比如有个基类 ...

  10. final,finally,finalize的区别

    1.final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为 ...

最新文章

  1. 关于RelativeLayout设置垂直居中对齐不起作用的问题
  2. 不抛弃,不放弃@《士兵突击》
  3. ERROR in multi ./src/main.js dist/bundle.js
  4. linux 打开php服务器文件夹,Linux下如何查看文件和文件夹大小
  5. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节3:I/O控制方式
  6. Vue教程:简介(一)
  7. php之include的使用
  8. 卷积(convolution)与相关(correlation)(matlab 实现)
  9. 智慧解析第20集:破解迷魂术
  10. JavaWeb篇-谷歌验证码的使用
  11. 台式电脑连不上wifi怎么办
  12. word封面和目录不要设置页码
  13. 淘宝Refrash_token签名错误的解决办法
  14. python爬取京东商品信息_使用selenium爬取京东商品信息
  15. 一个基于互联网医疗的创业公司,三年是一个收获
  16. python爬虫请求头是什么意思_Pytho爬虫中Requests设置请求头Headers的方法
  17. Little Keng
  18. 多多情报通:拼多多推广哪个效果好?有什么推广技巧?
  19. 伊豆:把豆瓣网装进口袋
  20. 抖音矩阵系统。抖音矩阵系统,抖音矩阵系统源码。

热门文章

  1. oracle 数据库的数据事务的相关概念
  2. css3新特性总结(视觉表现方面)
  3. php+MySql注入非暴力爆字段名
  4. javascript正则表达式(一)
  5. 《App后台开发运维与架构实践》第4章 Linux系统
  6. Received empty response from Zabbix Agent at [172.16.1.7]...
  7. excel2010冻结行列
  8. Snort日志输出插件详解
  9. 巧用云计算 突围移动APP行业乱象
  10. JAVA微信开发:[17]如何获取所有关注用户