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. 数据库学习之五--Union, Union All和Intersect

    一.定义 Union操作符用于合并两个或多个SELECT语句的结果集: 注:1. Union连接的Select语句之间必须拥有相同数量的列: 2. 列也必须拥有相似的数据类型: 3. 每条 SELEC ...

  2. a problem

    给出两个长度为 $n$ 的数组 $a, b$对于任意的 $a_i + b_j$, 求第 $k$ 大 不妨设 $a_i < a_{i + 1}, b_i < b_{i + 1}$ 对于任意的 ...

  3. vue+elementui 开发的网站IE浏览器加载白屏(不兼容)解决办法

    1.需要检查一下 export default { name: 'aa',-------vue的name是不可以重复的-----这个是决定性原因 data() { return {} } 2.变量声明 ...

  4. 前端武器库之jQuery示例

    1.全选 反选 取消 相关知识点: - 选择器 - .prop $('#tb:checkbox').prop('checked'); 获取值 $('#tb:checkbox').prop('check ...

  5. 物聯網安全黑客松 IoT Security and Privacy Hackathon

    感覺這次黑客松的程度屬於初階,但是節奏很快,內容緊湊.概念部分解說較多,以致實驗時間縮短,有些只能看demo有點遺憾.幸好有video-taped,事後回溯可以看看能不能replicate實驗.總體而 ...

  6. zabbix(7)邮件报警配置

    邮件报警可以使用Linux自带邮件服务器(postfix等),也可以使用其他邮件服务器(像腾讯邮箱,126邮箱) 一.使用mail. 1.确定zabbix server是否安装发送邮件的命令mail, ...

  7. TCP/IP 这猝不及防的爱情

    前言 前几天看了老刘的一篇文章,TCP/IP 大明邮差.正好最近也在读<计算机自顶向下>一书 心血来潮,想写一个女版的TCP/IP 正文 一天,我正在百花会上赏花,赏着赏着,就出现了一个令 ...

  8. mac使用xposed超详细入门级教程Android Studio-20190930

    工具 这里我使用的工具是Android Studio3.4.1,电脑环境mac os mojave 10.14.6(这个应该问题不大) 创建项目 1.打开Android Studio,看到这个界面,并 ...

  9. vue 页面间传值

    使用params传参 ,不能使用path 只能使用name 使用params传参,刷新参数会消失 router/index.js import Vue from 'vue' import Router ...

  10. Mininet系列实验(二):Mininet可视化应用

    1 实验目的 该实验通过Mininet学习miniedit可视化操作,可直接在界面上编辑任意想要的拓扑,生成python自定义拓扑脚本,简单方便.在实验过程中,可以了解以下方面的知识: Miniedi ...