您的位置:首页 > 其它

finally final finalize区别及 try catch finally中return值分析

2017-06-19 15:14 369 查看
一、final修饰符(关键字)

类被声明为final,意味着它不能被继承。因此一个类不能既被声明为abstract的,又被声明为final的。

变量或方法声明为final,可以保证它们在使用中不被改变;(引用变量对应的引用地址不能变,但是堆中对应的对象可以变); 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改(不可修改的是栈中存储的内存地址,不是堆中的对象);

方法被声明为final的也同样只能使用,不能重写;

方法的参数被final修饰表示在方法体内,该参数的值不可以被修改。

final StringBuffer sb = new StringBuffer(“Hello”);

sb.append(“Itcast”);//此时sb中的内容为 “HelloItcast”,这就是对象改变了.可以编译通过.

sb = new StingBuffer(“World”);//这就是引用改变.sb指向了新的引用. 会编译报错.

二、finalize是方法名。

Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

三、finally

finally在异常处理时提供finally块来执行任何清除操作。无论有没有异常被抛出、捕捉,finally块都会被执行。

四、try catch finally

1.try块或catch块如果有return 时, 返回值保存在一个临时区域里

2.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值、若finally 中有对之前返回的值进行了操作,并不会影响返回的值

3.将临时区域的返回值送到上一级方法中。

4.finally 最后执行指的是 try catch 模块最后执行

注意:返回值,需要区分是基本类型还是引用类。
如果是基本类型,临时区域存储的是基本类型值,finally中的更改不会对临时区域中的值有影响;
如果是应用类型,临时区域存储的是对象的引用地址,finally中更改对象时,会对临时区域的值对应的对象有影响


import org.junit.Test;

/**
* @Description 测试finally
* @author  zhangyt
*/
public class TestFinally {

@Test
public   void main() {
System.out.println(test());//返回2
System.out.println(test2());//返回"s2" ,需要考虑String是final的以及常量池的作用
System.out.println(test3().toString());//"s1s2s3"
}
public  int test(){
int a = 0;
try {
a=1/0;
return a;
} catch (Exception e) {
a=2;
return a;
}finally{
a=3;
//return a;
}
}
public  String test2(){
String s = "s";
try {
s = "s1";
int i = 1/0;
return s;
} catch (Exception e) {
s = "s2";
return s;
}finally{
s = "s3";
//return s;
}
}
public  StringBuilder test3(){
StringBuilder sb = new StringBuilder();
try {
sb.append("s1");
int i = 1/0;
return sb;
} catch (Exception e) {
sb.append("s2");
return sb;
}finally{
sb.append("s3");
//return sb;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  finally try-catch