对于初学者而言(当然也包括我)对于这三者真的不是很陌生,经常会看到它们。但对于三者之间的区别和联系一直是懵懵懂~~

今天心情不错,那就简单总结一下它们几个的区别和联系吧。如果又不对的地方欢迎批评指正~~

1.final

final是java的中的一个关键字。final关键字可以用来修饰属性,方法和类。还有就是如果内部类要访问局部变量的话,那么对应的局

部变量也必须为final关键字修饰的。

首先,使用final修饰的属性是不能够修改的。

例如:final int VALUE=100; 那么这里的VALUE的值是不能够修改的。

其次,是使用final修饰的方是不能够被重写的。

例如:如果某个子类继承了某个父类的话,那么一般而言这个子类是可以重写它们的父类的方法。

但是如果这个父类中的方法使用final关键字修饰的话,那么子类是不允许重写父类中final修饰的方法。

为了更好的说明这里点请看下面的代码:

/**
* 创建Person实例,作为Children类的父类
* @author 小浩
* @创建日期 2015-3-2
*/
class Person{
/**
* 大人可以挣钱,小孩是不能够挣钱的,
* 所以children类是不能够重写该方法
*/
public final void makeMoney(){
System.out.println("我长大后要挣好多好多的钱哦~~~");
} } /**
* 孩子类继承了Person类,单Children类无法重写makeMoney方法
* 因为此方法以使用final修饰
* @author 张浩
* @创建日期 2015-3-2
*/
class Children extends Person{ /**
* 这里报下面的错误,提示无法重写此方法
* Cannot override the final method from Person
*/
@Override
public void makeMoney(){
System.out.println("我是小孩,我想要挣钱~~");
} }

    最后,final修饰的类是不能够被继承的。也就是说,如果一个类使用final修饰符,那么它是不能够作为任何类的父类的。

例如:上面的Person类如果使用final修饰话,那么Children类就不能够继承Person类了哦。

总结,final修饰符出现主要作用是为了使相应的变量,对象或者方法一旦创建后,就不在发生任何改变。final修饰符比较经典的使用是

jdk中的String类,如果感兴趣可以查看jdk的源码。

此外给大家补充一个比较经典的例子(在阅读下面的例子之前,请先弄明白上面的内容):

/**
* 测试类
* @author 张浩
* @创建日期 2015-3-2
*/
public class Test2{
public static void main(String[] args) {
final StringBuffer VALUE=new StringBuffer("我考试好看100分,厉害不?");
System.out.println(VALUE);
//VALUE的值发生了改变,请问下面的例子是否会报错????
VALUE.append("不好意思,满分150分哦~~SB");
System.out.println(VALUE); }
}

首先说明上面不会报错的。

        对于final修饰的变量其对应值是不能够发生改变的。需要注意的是VALUE这个变量名是存储在栈中的,final修饰符不能够改变指的是VALUE指向堆中的内存地址的值是不能够改变的,因为StringBuffer可以在原来字符串的基础上面动态的修改。所以上面是没问题的

但是如果把StringBuffef换成为String的话,那样的话就不行了(String一旦创建后是不能够修改的哦)。

/**
* 测试类
* @author 小浩
* @创建日期 2015-3-2
*/ public class Test2{
public static void main(String[] args) {
final String VALUE=new String("我考试好看100分,厉害不?");
System.out.println(VALUE);
//下面是会报错的哦...
VALUE=VALUE+"不好意思,满分150分哦~~SB";
System.out.println(VALUE); }
}

2.finally

finally关键字一般也用在处理try{}catch{}finally{}的异常中,finally里面的内容一定会执行。

一般用在异常处理中资源的释放。对于try{}catch{}finally{}的讲解可以参考:

http://www.cnblogs.com/xiohao/p/4278405.html

3.finalize

finalize在垃圾回收中会使用。finalize是Object类中的方法。在垃圾回收器执行的时候会调用被回收对象的此方法。

用户可以重写此方法,已完成对其它资源的回收。如关闭文件等。JVM不保证此方法一定会执行哦~~~~

好吧,今天就先到这里吧~~

  

  

final,finally和finalize三者的区别和联系的更多相关文章

  1. final,finally和finalize之间的区别

    (1)final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.内部类要访问局部变量,局部变量必须定义成final类型,比如一段代码 (2)finally是异常处理语句结构的一部 ...

  2. final .....finally ...... 和Finalize ......区别

    一.性质不同 ()final为关键字: ()finalize()为方法: ()finally为为区块标志,用于try语句中: 二.作用 ()final为用于标识常量的关键字,final标识的关键字存储 ...

  3. final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?

    继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...

  4. Java中final,finally和finalize区别

    Day11_SHJavaTraing_4-18-2017 Java中final,finally和finalize区别 1.final—修饰符(关键字) ①final修饰类,表示该类不可被继承 ②fin ...

  5. 异常-面试题之final,finally和finalize的区别,如果在finally之前有return

    package cn.itcast_07; /* * 面试题: * 1:final,finally和finalize的区别 * final:最终的意思,可以修饰类,成员变量,成员方法 * 修饰类,类不 ...

  6. final,finally和finalize的区别

    package com.heima.test; public class Test1 {  /**  * * A:面试题1   * final,finally和finalize的区别   * fina ...

  7. /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别

    原文地址: /storage/sdcard, /sdcard, /mnt/sdcard 三者的区别 - petercao - 博客园 http://www.cnblogs.com/bluestorm/ ...

  8. 多线程——Executor、ExecutorService、Executors三者的区别

    Executor.ExecutorService.Executors三者的区别: 层次关系: public interface ExecutorService extends Executor {} ...

  9. string、Empty和null三者的区别

    string.Empty和null三者的区别 本文转自  http://www.bitscn.com/pdb/dotnet/201003/181883.html 时间:2010-03-01 00:00 ...

随机推荐

  1. C++中容器的使用(二)

    第一章容器 第1条:慎重选择容器类型. 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器 ...

  2. Oracle、Mysql、SqlServer创建表和给表和字段加注释

    一.Oracle --创建表 create table test (      id varchar2(200) primary key not null,      sort number,     ...

  3. html div 加边框样式

    边框虚线样式:dashed边框实现样式:solid border:1px dashed #000代表设置对象边框宽度为1px黑色虚线边框 border:1px solid #000代表设置对象边框宽度 ...

  4. 内网批量测试登录机器工具,并且dir 目标机器c盘

    // Ipc.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <w ...

  5. Java中使用注释

    在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上.因此,注释是程序源代码的重要组成部分,一定要加以重视哦! Ja ...

  6. Jedis使用过程中踩过的那些坑

    1. 一个 大坑:若实例化 JedisShardInfo 时不设置节点名称(name属性),那么当Redis节点列表的顺序发生变化时,会发生“ 键 rehash 现象” 使用BTrace追踪redis ...

  7. zoj3229 有源汇上下界最大流

    题意:有一个人每天给妹子拍照,每个妹子有最少拍照数,每天有最大拍照数,每天只能给某些特定的妹子拍照,求最大拍照数 题解:很容易看出来的有源汇上下界最大流,对于有源汇 的上下界最大流,我们按照无源汇的操 ...

  8. java基础篇 -- 常用的日期加减和日期格式化工具类

    平时我们遇到日期的加减,感觉是相当麻烦的,以下是常用的日志加减的方法,包括日的加减.月的加减等,也包括了一些常用的日期格式化,这样在我们以后碰到日期加减的时候会省去很多麻烦,欢迎大神指正和吐槽: pa ...

  9. ASP.NET Core 配置文件(无处不在的依赖注入)

    前烟: .NET Core 中取消了以往的 XML 节点配置文件,改用了 *.json 格式. 在 Startup.cs 文件中,构造方法 build appsetting.json 文件, 本文主要 ...

  10. Servlet细节处理

    1.Servlet的线程安全问题 尽管servlet的工作效率高,但是线程也是不安全的,因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求 解决方案:所 ...