1、final
在java中,final可以用来修饰类、方法 和变量(成员变量和局部变量)
1> 修饰类时:当用final修饰类的时候,表明该类不能被其他类所继承,当我们需要让一个类永远不被继承,此时就可以使用final修饰,但要注意:final类中所有的成员都会隐式的定义为final方法。
2>修饰方法:
使用final方法的原因主要有两个:
1、把方法锁定,以防止继承类对其进行更改
2、效率,在早期的版本中,会将final方法转为内嵌调用,但若方法过于庞大,可能在性能上不会有到达的提升
被final修饰的方法,不可以被重写
注意:若父类中final方法的访问权限是private,将导致子类不能直接继承该方法,因此,此时可以在子类中定义相同名的函数,此时不会与重写final的锚段,而是在子类中重新定义了新方法
3>修饰变量
只能被赋值一次
对于修饰的成员变量,赋值可以在三种情况:1、创建的时候赋值
2、在构造代码块中赋值 3、在所有的构造函数中赋值
2、finally
作为异常处理的一部分,它只能用在try/catch语句中,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下
其实上面有一定的问题:
如:
@Test
public void test(){
int j = 10/0;
try{
int i = 10/0;
System.out.println("这里执行了一句");
return;
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("我最终还是执行了");
}
}
在开始的时候,try块里面还没有执行,这个时候就报错了,fianlly 中的就不会执行,如果执行了try里面的语句报错,则即使里面有return,finally先执行,然后执行return;
finally块不会执行的第二中情景
@Test
public void test(){
try{
int i = 10/0;
System.out.println("这里执行了一句");
//强制退出
System.exit(0);
return;
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("我最终还是执行了");
}
}
finally块不会执行第三种情景
断电等物理因素
3、finalize
finalize() 是在java.lang.Object 里定义的,也就是说每一个对象都有这么个方法,这个方法在gc启动,该对象被回收的时候被调用,其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定)所以一般是不需要我们去实现finalize的
特殊情况下、需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期有效,那么就需要实现finalize,关闭这个链接
一个对象的finalize方法只会被调用一次,而且finalize()方法被调用不意味着gc会立即回收该对象