1.final
final修饰符(关键字): 如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此,一 个类不能既被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证它们在使用中不被改变。其初始化可以在两个地方;一是其定义处,也就是说,在final变量定义时直接给其赋值;一是在构造函数中。 这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值,而在以后的引用中只能读取,不可修改。被声明为final 的方法也同样只能使用,不能重写(override) 。
(1).final成员
当定义变量时,在前面加上final关键字,那么这个变量一旦被初始化,就无法再被修改.对于基本类型来说是值不可改变,而对与引用类型来说是其引用不能改变
public static void main(String[] args) {
final int a = 5;
a = 6; /此时系统就会报错 Cannot assign a value to final variable 'a'/
final String str = "abc";
str = "def";
此时 str 已经指向了 "abc" 并且 被final关键字修饰 所以其引用不能改变
}
但是还有一种用法是定义方法中的参数为final,对于基本类型来说,这样没有什么改变,因为基本类型的变量在调用方法的时候是值传递,也就是说在方法中更改这个参数的变量不会影响到调用语句。而对于引用类型,有很大影响,因为引用类型在传递时是传递其引用的,所以方法中对对象变量的修改会影响到调用语句中的对象变量。所以明确的使用final声明,会防止你无意的修改而影响到调用方法。
(2).final 方法
两个原因:
1.要么是这个方法提供的功能满足要求,不需要进行扩展,也不允许从此类继承的类来覆盖这个方法.
2.提高程序的效率,但是当主体很大时,或者多出调用此方法,调用主体代码便会迅速膨胀,反而会影响效率.
(3).final 类
final类不能被继承,没有子类,final类中的方法默认是final的。如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为 final类
2.finally
在异常处理时提供finally块来执行任何清除操作,如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块(可以有,也可以没有)
try {
String str = null;
System.out.println(str.length());
System.out.println("啊哈哈!");
}catch (NullPointerException e){
System.out.println("捕获空指针异常!");
}finally {
System.out.println("释放资源!");
}
try{
int a =10;
int b = 0;
System.out.println(a/b);
System.out.println("hhh");
}catch (ArithmeticException e){
System.out.println("算术异常!!!!");
}
3.finalize
finalize是方法名,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有引用时对这个对象调用的。它是在Object类中定义的,因此所有类都继承了它。子类覆盖finafize()方法以整理系统资源或者其他清理工作。finalize()是在垃圾收集器删除对象之前对这个对象调用的。
public class test{
public static void main(String[] args){
Person p = new Person();
p = null;
此时堆当中的Person对象就没有变量指向了,就变成了垃圾,
等到垃圾回收机制调用的finalize()的时候会输出那句话
}
}
class Person{
protected void finalize() throws Throwable{
System.out.println("哈哈哈");
}
}