Java面试 - final、finally、finalize的区别?
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的区别?的更多相关文章
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- Android源码中final关键字的用法及final,finally,finalize的区别
Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...
- java中的final, finally, finalize的区别
final修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为abstract的,又被声明为final的.将变量或方法声明为fin ...
- 谈谈final, finally, finalize的区别
final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为fi ...
- 2018.5.7每天一题面试题----final, finally, finalize 的区别
1.final修饰符(关键字).被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承. 因此一个类不能既被abstract声明,又被final声明.将变量或方法声明为final ...
- 一、基础篇--1.1Java基础-final, finally, finalize 的区别
final, finally, finalize 首先,这三个关键字没什么关联,只是放在一起比较像,用法用处完全不同. final: final关键字可以用来修饰类.方法.变量(成员变量和局部变量), ...
- Java之final、finalize、finally的区别
一.性质不同(1)final为关键字:(2)finalize()为方法:(3)finally为为区块标志,用于try语句中:二.作用(1)final为用于标识常量的关键字,final标识的关键字存储在 ...
- java中final,finally,finalize三个关键字的区别
final 可以作为修饰符修饰变量.方法和类. 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改. 被final修饰的方法不能够在子类中被重写(override): 被 ...
- Java基础-final和static的区别
很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...
随机推荐
- jQuery相关方法6----三大系列属性
一.获取和设置元素的宽和高------width( )方法和height()方法 <!-- 点击按钮,设置div的宽和高为原来的两倍 --> <script src="ht ...
- luogu P1382 楼房
二次联通门 : luogu P1382 楼房 /* luogu P1382 楼房 线段树 + 扫描线 + 离散化 正解貌似是堆... MMP...二段式线段树各种错误... 离散化一下横坐标 扫描线扫 ...
- TensorFlow(三):非线性回归
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 非线性回归 # 使用numpy生成200个随机 ...
- ZROI Day6比赛总结
比赛还没结束而且我没有参加比赛就来这里了. T1 略 T2 设\(ans_d\)表示\(d|b_i\)的方案数(最后反演一下就可以) 设\(d\not|a_i\)的个数为\(l\)(可以\(O(n\l ...
- jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译)
jQuery Cookie (内附 上百行的中文使用手册,与 所有的注释中文翻译) 博主亲自翻译. 大家多多捧场. 更多资源请点击"查看TA 的资源" .全场通通 2积分. htt ...
- 史上最好用的依赖注入框架Google Guice【转】
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC).Guice非常小而且快. (其他的依赖注入框架还有Dagger,Spring) Spring ...
- fluent中如何对一个非整个volume的特定的区域进行数据分析?【转载】
作者:王蒙 链接:https://www.zhihu.com/question/37432813 来源:知乎 很抱歉,我不知道 fluent 中是否有这一功能,我这个学期才开始学.但 CFD-Post ...
- 安装virtual box
将安装包放在app目录下: 进入安装目录,输入sudo gdebi 安装包名 安装完后,可以在搜索框中搜索:virtual 会出现安装好的虚拟机盒子.
- Facebook开源时间序列内存数据库Beringei,追求极致压缩率——如果是int根据大多数时间序列中的值与相邻数据点相比并没有显著的变化,只要使用XOR将当前值与先前值进行比较,然后存储发生变化的比特。最终,该算法将整个数据集至少压缩了90%
转自:http://www.infoq.com/cn/news/2017/02/Facebook-Beringei 2017年2月3日,Facebook宣布将开源他们的高性能时序数据存储引擎Berin ...
- 使用多个tomcat如何修改端口号
一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.