final,finally和finalize三者的区别和联系

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

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

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不保证此方法一定会执行哦~~~~

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

  

  

时间: 2024-08-12 06:28:02

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

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

一.性质不同 (1)final为关键字: (2)finalize()为方法: (3)finally为为区块标志,用于try语句中: 二.作用 (1)final为用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final常量的具体用法将在下面进行介绍): (2)finalize()方法在Object中进行了定义,用于在对象"消失"时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数:用户自定义时,用于释放对象占用的资源(比如进行I/0操作): (3)fi

Java千百问_03基本语法(011)_final,finally,finalize有什么区别

点击进入_更多_Java千百问 1.final,finally,finalize有什么区别 final,finally是java的关键字,finalize是jdk的一个方法名,它们虽说字面意思类似,但是他们的使用却完全不同.具体如下: final final是一个修饰符关键字. 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承. 如果一个变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,

C#中数组、ArrayList和List三者的区别

在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. [csharp] view plaincopy <span style="font-family:SimSun;font-size:18px;">//数组 string[] s=new string[2]; //赋值 s[0]="a"; s[1]=&quo

Java基础-final变量和普通变量的区别

当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了. 那么final变量和普通变量到底有何区别呢?下面请看一个例子: public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "he

菜鸟,大牛和教主,三者的区别(转载,有种莫名的喜感。。。)

对菜鸟来说题目有三种:会算法且能AC的,会算法但不能AC的,不会做的 对大牛来说题目有两种:会做的,不会做的 对教主来说题目有两种:能AC的,数据有错的 菜鸟提交WA了,找了N久找不出错时,在论坛大骂数据有错,但是没人理 大牛提交WA了,找了N久找不出错时,写暴力程序或者求别人的AC程序对拍 教主提交WA了,Judge马上修正数据 菜鸟面对一道难题,直接暴搜 大牛面对一道难题,算了算时间复杂度不对,或者证明出是NP难,果断放弃 教主面对一道难题,说,虽然我不会做,但AC还是没有问题的 菜鸟AC了

菜鸟,大牛和教主三者的区别(转自hzwer)

菜鸟,大牛和教主,三者的区别 对菜鸟来说题目有三种:会算法且能AC的,会算法但不能AC的,不会做的 对大牛来说题目有两种:会做的,不会做的 对教主来说题目有两种:能AC的,数据有错的 菜鸟提交WA了,找了N久找不出错时,在论坛大骂数据有错,但是没人理 大牛提交WA了,找了N久找不出错时,写暴力程序或者求别人的AC程序对拍 教主提交WA了,Judge马上修正数据 菜鸟面对一道难题,直接暴搜 大牛面对一道难题,算了算时间复杂度不对,或者证明出是NP难,果断放弃 教主面对一道难题,说,虽然我不会做,但

SIEM、SOC、MSS三者的区别与联系

SIEM.SOC.MSS三者的区别与联系 前言 SIEM和SOC在国内并不是一个新兴的名词,相反在国内安全圈内经过了10余年的挣扎,SIEM已经趋于成熟,但是SOC仍处于一个鸡肋的位置,我认为其主要原因在SOC受制于国内体制.政策.相关日志标准.应用环境.传统认识的制约,从而它在国内一开始就是以产品的方式出现.缺少了MSS的辅助SOC就像是要求汽车驾驶员去驾驶维护飞机,这也是国内SOC一直无法用起来的主要原因. 而以SOC为基础的MSS(可管理安全服务)一直无法发展状大的原因有二. 欧美国家对M

转:c++里关于cerr,clog,cout三者的区别

c++里关于cerr,clog,cout三者的区别: cerr(无缓冲标准错误)-----没有缓冲,发送给它的内容立即被输出 clog(缓冲标准错误)--------有缓冲,缓冲区满时输出 cout-------------------------标准输出 三个都是ostream类定义的输出流对象, cout是在终端显示器输出,cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否漫了,都立即输出流中所有数据,然后插入一个换行符. cerr流对

x64、x86_64、x64三者的区别

x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA-32” x84_64是x86 CPU开始迈向64位的时候,有2选择:1.向下兼容x86.2.完全重新设计指令集,不兼容x86.AMD抢跑了,比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64,抢了64位PC的第一桶金,得到了用户的认同.而Intel选择了设计一种不兼容x86的