1.引言
final关键字是Java中的修饰符,用于修饰类,局部变量,成员变量和成员方法。
用法
final修饰类:该类不能被继承
final修饰局部变量:变量中的数值(基本数据类型)或地址(引用数据类型)不可以被改变。在声明时,就必须赋值。
final修饰成员变量:可以先声明,再赋值,但只能赋值一次。赋值后不能改变。
final修饰方法时:该方法不能被子类重写
2.引言
finally语句是接在异常处理之后的,作为一个必然执行的异常统一处理出口。无论是否发生异常,finally语句必然执行。
语法格式
try{
// 有可能发生异常的代码段
}catch(异常类型1 对象名1){
// 异常的处理操作
}catch(异常类型2 对象名2){
// 异常的处理操作
} ...
finally{
// 异常的统一出口
}
1. try-catch-finally中哪一部分可以省略
catch和finally可以省略其中的一个,但catch和finally不能同时省略
2. finally内的语句不会被执行或者没有被完全执行的情况
1.finally语句块中发生了异常
2.在finally前面的代码中使用了System.exit()退出了程序,JVM被关闭了。
3.finally所在的程序块线程死亡。
4.程序执行到finally之前,电脑关闭或CPU关闭
3. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
finally会被执行,以下例子展示常见两种情况。
/*执行流程:
*1. 先计算返回值, 并将返回值存储起来, 等待返回
*2. 执行finally代码块
*3. 将之前存储的返回值, 返回出去;
*注意:被缓存的的是变量栈中的值,如果该值有引用对象,则在返回值被存储后,依然可以用finally中语句对该值的引用内容做改变。如果该值是基本数据类型,不管finally对该值做任何的改变,返回的值都不会改变。
*/
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 0;
div(a,b);
System.out.println(b);//打印出来b的值为0,fianlly没有改变之前被缓存的b的值
Card card = new Card("球星卡");
Card newCard = setPrice(card);
System.out.println(newCard.price);//打印1,说明c的引用对象里的属性在fianlly语句块中被改变,其实c的内容并没有被改变,它依然指着原来的内存地址,其指的对象在堆中,堆中的对象的值被改变了
}
public static int div(int a, int b){
try{
System.out.println(a/b);
}catch(RuntimeException e){
return b;
}finally {
b = 5;
System.out.println(b);//打印出来5,说明finally中的语句被执行了
}
return b;
}
public static Card setPrice(Card c){
try{
c.price = 10000;
return c;
}catch(Exception e){
}finally {
c.price = 1;
System.out.println("已修改价格");//会执行打印内容
}
return c;
}
}
class Card{
public int price;
public String name;
public Card(String name) {
this.name = name;
}
}