final与finally的却别
先说final
final可修饰:
1.修饰变量
2.修饰方法
3.修饰类
首先来看第一种情况,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,它是个常量, final在修饰方法的传入参数时,则传入参数时不可修改的;
如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,这里这个不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。
在final修饰方法时,方法是不可以被该类的子类所继承的.
在final修饰类是,被修饰的类是不可以被继承的
被fianl修饰的变量必须被初始化,初始化的方式有:
1.在定义的时候初始化
2.在构造器中初始化,但静态的final是不可以的
3.final变量可以在构造块中初始化,如果是静态的就不能再非静态的构造块中初始化
代码验证:
.public class Test {
. // 在定义时初始化
. public final int A = 10;
.
. public final int B;
. // 在初始化块中初始化
. {
. B = 20;
. }
.
. // 非静态final变量不能在静态初始化块中初始化
. // public final int C;
. // static {
. // C = 30;
. // }
.
. // 静态常量,在定义时初始化
. public static final int D = 40;
.
. public static final int E;
. // 静态常量,在静态初始化块中初始化
. static {
. E = 50;
. }
.
. // 静态变量不能在初始化块中初始化
. // public static final int F;
. // {
. // F = 60;
. // }
.
. public final int G;
.
. // 静态final变量不可以在构造器中初始化
. // public static final int H;
.
. // 在构造器中初始化
. public FinalTest() {
. G = 70;
. // 静态final变量不可以在构造器中初始化
. // H = 80;
.
. // 给final的变量第二次赋值时,编译会报错
. // A = 99;
. // D = 99;
. }
.
. // final变量未被初始化,编译时就会报错
. // public final int I;
.
. // 静态final变量未被初始化,编译时就会报错
. // public static final int J;
.}
finally语句?
finally就比较简单了,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行。
即使在try语句中有return等结束方法或循环的代码被执行后,finally中的内容仍然会被执行
public class Test2{
public static void main(String[] args){
try{
System.out.println("return之前!");
return;
System.out.println("return之后!");
}catch(Exception e){
System.out.println("程序抛出了异常");
}finally{
. System.out.println("finally被执行了!");
}
}
}
运行结果:
return之前!
finally被执行了!
从结果上我们看到finally中的代码被执行,即使程序被return中断,这是因为return的返回并没有彻底返回,而是在finally中的语句执行完后,彻底返回,结束