final:用于声明属性, 方法和类,分别表示属性不可变、方法不可覆盖、被其修饰的类不可继承。

finally:异常处理语句结构的一部分,表示总是执行。

finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的finalize()方法。JVM不保证此方法总被调用。

举例:

修改被final修饰的属性nickName

public class Student{
public static void main(String[] args) {
final String nickName ="Jack";
nickName = "Jack Ma";
}
}

运行结果

Error:(27, 5) java: 无法为最终变量nickName分配值

由此说明被final 修饰的属性是不可变的。

那么,final 修饰的方法setName()是否可以被重写呢?

class Person {
private String name;
public final void setName(String name){
this.name = name;
}
}
public class Student extends Person{
// 重写被final 修饰的setName()方法
public void setName(String name){
System.out.println(name);
}
}

运行结果

Error:(27, 15) java: Student中的setName(java.lang.String)无法覆盖
Person中的setName(java.lang.String),被覆盖的方法为final。

由此说明被final 修饰的方法是不能被重写的。

那么,final修饰的类是否可以被继承呢?

final class Person {
private String name;
public void setName(String name){
this.name = name;
}
}
// 继承被final 修饰的Person类
public class Student extends Person{
}

运行结果

Error:(24, 30) java: 无法从最终Person进行继承。

由此说明被final 修饰的类是不能被继承的。

当没有出现异常时,异常处理语句中的finally 是否会被执行呢?

public class Student {
public static void main(String[] args) {
try {
int i = 1;
int result = i / 1;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.print(""没有出现异常时,执行finally"");
}
}
}

运行结果

没有出现异常时,执行finally

当出现异常时,异常处理语句中的finally 是否会被执行呢?

public class Student {
public static void main(String[] args) {
try {
int i = 1;
int result = i / 0;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.print(""出现异常时,执行finally"");
}
}
}

运行结果

java.lang.ArithmeticException: / by zero
at Student.main(Student.java:27)
出现异常时,执行finally

由此可知,异常处理语句结构的一部分finally{},无论是否出现异常,finally{}一定会被执行。

最后我们再来看一下,finalize()方法是如何使用的?


class Person {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
@Override
protected void finalize() throws Throwable {
System.out.print("调用finalize()方法,在Student对象从内存中删除之前对setName进行清理操作");
super.finalize();
}
}
public class Student extends Person {
public static void main(String[] args) throws Throwable {
Student s1 = new Student();
Student s2 = new Student();
System.out.println("s2=s1之前,s1指向的对象地址:"+s1);
System.out.println("s2=s1之前,s2指向的对象地址:"+s2);
// 设置name
s1.setName("Rose");
s2.setName("Jack");
//将s1指向的对象地址赋给s2, 则s1和s2指向的是同一个对象地址
s2=s1;
System.out.println("s2=s1之后,s1指向的对象地址:"+s1);
System.out.println("s2=s1之后,s2指向的对象地址:"+s2);
// 显式调用垃圾回收方法 触发finalize()
System.gc();
System.out.println("学生名字:"+s1.getName());
}
}

运行结果

s2=s1之前,s1指向的对象地址:Student@a09ee92
s2=s1之前,s2指向的对象地址:Student@30f39991
s2=s1之后,s1指向的对象地址:Student@a09ee92
s2=s1之后,s2指向的对象地址:Student@a09ee92
学生名字:Rose
调用finalize()方法,在Student对象从内存中删除之前对setName进行清理操作。
Process finished with exit code 0

从运行结果来看,在垃圾回收器执行的时候会调用被回收对象的finalize()方法。

Java面试 - final、finally、finalize的区别?的更多相关文章

  1. 【Java面试题系列】:Java中final finally finalize的区别

    本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...

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

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

  3. java中的final, finally, finalize的区别

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

  4. 谈谈final, finally, finalize的区别

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

  5. 2018.5.7每天一题面试题----final, finally, finalize 的区别

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

  6. 一、基础篇--1.1Java基础-final, finally, finalize 的区别

    final, finally, finalize 首先,这三个关键字没什么关联,只是放在一起比较像,用法用处完全不同. final: final关键字可以用来修饰类.方法.变量(成员变量和局部变量), ...

  7. Java之final、finalize、finally的区别

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

  8. java中final,finally,finalize三个关键字的区别

    final 可以作为修饰符修饰变量.方法和类. 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改. 被final修饰的方法不能够在子类中被重写(override): 被 ...

  9. Java基础-final和static的区别

    很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...

随机推荐

  1. getchar 和EOF

    本文章基于:http://www.cnblogs.com/QLinux/articles/2465329.html,稍作了修改. 大师级经典的著作,要字斟句酌的去读,去理解.以前在看K&R的T ...

  2. vue学习--vue项目端口不固定,无法指定问题

    写于20190819 前面是自己解决的思路,后面是解决方法以及需要记住的一些更改 package.json 之前只知道vue项目是基于node.js,对node.js了解不是很深入,项目的开始文件是p ...

  3. Ubuntu 14.04 卸载通过源码安装的库

    cd cere-solvermkdir buildcd buildcmake ..sudo makesudo make install 卸载通过以上方式源码安装的库 再次进入buildsudo mak ...

  4. selenium鼠标操作

    #-*- coding:utf-8 -*- import time from selenium import webdriver from selenium.webdriver.common.acti ...

  5. Java基本的线程操作(附代码)

    啦啦啦啦,从头整理一遍java并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @Test public void newTread(){ Thread t1 = new Thread(n ...

  6. 微信小程序--更换用户头像/上传用户头像/更新用户头像

    changeAvatar:function (){ var that=this; wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'c ...

  7. 2018-2019-2 20165209 《网络对抗技术》Exp8: Web基础

    2018-2019-2 20165209 <网络对抗技术>Exp8: Web基础 1 基础问题回答和实验内容 1.1基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表 ...

  8. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  9. Dubbo 2.6.0升级到2.7.3

    dubbo依赖,修改groupId和升级version版本号 <dependency> <groupId>com.alibaba</groupId> <art ...

  10. python __new__

    1.__new__的作用是什么? 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程 ...