1.final关键字可以用来修饰类,成员方法,方法的参数,成员变量(静态和非静态的)
(1).final修饰类表示类为终类,不能被继承,String就是这样的一个类.
(2).final修饰一个成员方法时,此方法在子类中不能被覆盖.
(3).final修饰成员变量,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即是个常量;如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,而所引用的对象的成员属性是可以改变的.
(4).由关键字abstract定义的抽象类含有必须由继承自它的子类实现的抽象方法,因此无法同时使用final和abstract来修饰同一个类.同样final也不能用来修饰接口,final修饰的类其成员方法都是不能够被重写的。
2.finally块,try{}块中有return,continue, break中并不会影响finally块的执行,finally块会在return之前执行.同样,finally语句块是在循环被跳过(continue)和中断(break)之前被执行.
(1).return-finally测试代码:
输出:
before return
call finally block
(2).break-finally测试代码:
输出:
call finally block-0
call finally block-1
(3).continue-finally测试代码:
输出:
call finally block-0
call finally block-1
3.finalize方法
finalize方法属于java.lang.Object类,它的定义如下:
protected void finalize()throws Throwable{}
finalize()方法是GC运行机制的一部分,finalize方法是在GC清理它所从属的对象时被调用,通常被用来释放资源,如果在执行它的过程中抛出无法捕获的异常,GC将终止对此对象的清理,并且此异常会被忽略.
程序调用System的gc()方法,引起GC的执行,GC在清理对象时会调用它的finalize()方法.
测试代码:
输出:
call finalize()
(1).final修饰类表示类为终类,不能被继承,String就是这样的一个类.
(2).final修饰一个成员方法时,此方法在子类中不能被覆盖.
(3).final修饰成员变量,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即是个常量;如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,而所引用的对象的成员属性是可以改变的.
(4).由关键字abstract定义的抽象类含有必须由继承自它的子类实现的抽象方法,因此无法同时使用final和abstract来修饰同一个类.同样final也不能用来修饰接口,final修饰的类其成员方法都是不能够被重写的。
2.finally块,try{}块中有return,continue, break中并不会影响finally块的执行,finally块会在return之前执行.同样,finally语句块是在循环被跳过(continue)和中断(break)之前被执行.
(1).return-finally测试代码:
public class Main {
public static void main(String[] args) {
int i = 0;
try{
if(i == 0){
System.out.println("before return");
return ;
}
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("call finally block");
}
}
}
输出:
before return
call finally block
(2).break-finally测试代码:
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 2; i++){
try{
if(i == 1){
break;
}
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("call finally block-"+i);
}
}
}
}
输出:
call finally block-0
call finally block-1
(3).continue-finally测试代码:
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 2; i++){
try{
if(i == 1){
continue;
}
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("call finally block-"+i);
}
}
}
}
输出:
call finally block-0
call finally block-1
3.finalize方法
finalize方法属于java.lang.Object类,它的定义如下:
protected void finalize()throws Throwable{}
finalize()方法是GC运行机制的一部分,finalize方法是在GC清理它所从属的对象时被调用,通常被用来释放资源,如果在执行它的过程中抛出无法捕获的异常,GC将终止对此对象的清理,并且此异常会被忽略.
程序调用System的gc()方法,引起GC的执行,GC在清理对象时会调用它的finalize()方法.
测试代码:
class Test{
protected void finalize()throws Throwable{
System.out.println("call finalize()");
}
}
public class Main {
public static void main(String[] args) {
Test t = new Test();
t = null;
System.gc();
}
}
输出:
call finalize()