可能猛的一看好像这些有着联系,但是其实他们一点关系都没有,只是长的很像的。
就像是生活中有些人虽然长的很像,但是一点血缘关系都没有,除非时电影、电视剧中,只要是长得像就会有点关系(哈哈)
虽然没关系但是他们的作用也要搞清楚
final(三大修饰符之一):
可以修饰类(此类不能被继承)
可以修饰方法(此方法不能被覆盖)
可以修饰变量:此变量值不可改变--常量(无初始值、只允许赋值一次)
各种常量的赋值:
1). 局部常量:显示初始化
2). 实例常量的赋值:显示初始化、动态代码块、构造方法。
3). 静态常量的赋值:显示初始化、静态代码块。
不同常量类型的特点:
1). 基本数据类型常量:值不可变。
2). 引用数据类型常量:地址不可变。
finalize()方法:
finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
垃圾对象:没有有效引用指向此对象,为垃圾对象(两个对象相互引用也为无效引用)
垃圾回收:由GC销毁垃圾对象,释放数据存储空间
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
手动回收机制:使用System.gc();通知JVM执行垃圾回收(执行有间隔时间)如果在执行过程中,被别的有效引用指向此对象,那么垃圾回收将不再回收此对象,容易造成内存泄漏
垃圾复活:
protected void finalize(){
super.finalize();
System.out.println("execute method finalize()");
//将想要回收的垃圾做有效引用
}
不建议使用子类覆盖Object中的finalize()方法去手动执行垃圾回收
finally:
finally一般用在如果出现异常的时候,可以去关闭资源,减少资源占用
public class TestFinally {
public static void main(String[] args) {
StringBuffer a = test2();
String s = a.toString();
int i = Integer.parseInt(s);
System.out.println(i);
}
public static StringBuffer test2(){
StringBuffer a = new StringBuffer();
try{
a.append("1");
return a;
}catch( Exception e ){
e.printStackTrace();
return a;
}finally{
a.append("2");
}
}
}
结果:12