final,finally,finalize的区别

final

final用于声明属性、方法和类,分别表示属性不可变(属性一旦被分配内存空间就必须初始化并且以后不可变)、方法不可覆盖(方法一旦定义必须有实现代码并且子类里不可被覆盖)和类不可被继承(不能再派生出新的子类)

  • final属性:
    被final修饰的变量不可变。不可变有两重含义:一是引用不可变,二是对象不可变。final指的是引用不可变,即它只能指向初始时指向的那个对象。所以,被final修饰的变量必须被初始化。
    final属性初始化可以通过以下几种方式:
    1.在定义的时候初始化。
public class Test{
    public final int a=0;
    private Test(){
        
    }
}

2.final成员变量可以在初始化块中初始化,但不可在静态初始化块中初始化。

public class Test {
    public final String color;
 
    {
        color = "red";
    }
}

初始化块会先于构造方法执行。

3.静态final成员变量可以在静态初始化块中初始化,但不可在初始化块中初始化。

public class Test{
    public static final int a;
    static{
        a=0;
    }
}

4.在类的构造器中初始化,但静态final成员变量不可以在构造函数中初始化。

public class Test{
    public final int a;
    private Test(){
        a=0;
    }
}

当a这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其分配内存空间,而只是定义了一个变量a,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化。

  • final方法:当一个方法声明为final时,该方法不允许任何子类重写这个方法,但子类仍然可以使用这个方法。
  • final参数:用来表示这个参数在这个函数内部不允许被修改
public void testBaseType(final int i){
    int n = i;
    i = 9; //编译报错
    System.out.println("i = "+i);
    System.out.println("n = "+n);
}
  • final类当一个类被声明为final时,此类不能被继承,所有方法都不能被重写。但这并不表示final类的成员变量也是不可改变的,要想做到final类的成员变量不可改变,必须给成员变量怎加final修饰。一个类不能既被声明为abstract,又被声明为final。
finally

finally作为异常处理的一部分,它只能在try/catch语句中,并且附带一个语句块表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。

Connection conn=null;
Statement stmt=null;
try{
  conn=DriverManager.getConnection(url,uName,pwd);
  stmt=conn.creatStatement();
  stmt=executeUpdate(update);
}catch(Exception e)finally{
  if((stmt!=NULL)
    stmt.close();
  if(conn!=NULL)
    conn.close();
}

不管程序运行是否出现异常,finally中的代码一定会执行,这样能保证在任何情况下数据库的连接资源都能够被释放。

finalize

finalize时Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。
一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

你可能感兴趣的:(final,finally,finalize的区别)