比较Java中的final,final和finalize()
final
1)'final'是访问修饰符或关键字修饰符。
2)此访问修饰符适用于类,方法和变量。
示例1:将类声明为final
final class FinalClass{
public static void main(String[] args){
System.out.println("Hi,this is final class");
}
}输出(描述)
每当我们将类声明为final时,都需要在class关键字之前编写final修饰符。
E:\javasource>java FinalClass Hi,this is final class
示例2:声明方法为最终方法
class FinalMethod{
final void finalMethod(){
System.out.println("Hi,this is final method");
}
public static void main(String[] args){
FinalMethod fm = new FinalMethod();
fm.finalMethod();
}
}输出(描述)
每当我们将方法声明为final时,都需要在方法返回类型之前编写final修饰符。
E:\javasource>java FinalMethod Hi,this is final method
示例3:将变量声明为final
class FinalVariable{
final int a = 10;
public static void main(String[] args){
FinalVariable fv = new FinalVariable();
System.out.println("Hi,"+fv.a+" is final variable");
}
}输出(描述)
每当我们将变量声明为final时,都需要在变量返回类型之前编写final修饰符。
E:\javasource>java FinalVariable Hi,10 is final variable
3)当一个类声明为final时,这意味着不可能创建子类,或者换句话说,我们可以说final类不能被继承,这就是为什么不能创建子类的原因。
示例:无法为final类创建子类
final class FinalClass{
public static void main(String[] args){
System.out.println("Hi,this is final class");
}
}
class ChildClass extends FinalClass{
}输出(描述)
每当我们尝试继承FinalClass时,由于无法创建final类的子类,我们将得到编译时错误。
E:\javasource>javac ChildClass.java
ChildClass.java:11: cannot inherit from final FinalClass
class ChildClass extends FinalClass{
1 error4)当方法声明为final时,这意味着我们无法覆盖final方法,因为final方法将与子类中的状态相同,我们无法更改实现,因为我们已经知道final是final我们无法更改,或者其植入是固定的。
示例1:尝试在子类中重写父类的final方法。
class ParentClass{
final void finalMethod(){
System.out.println("Hi,this is actual final method");
}
}
class ChildClass extends ParentClass{
final void finalMethod(){
System.out.println("Hi,this is overrideable final method");
}
}输出(描述)
每当我们尝试在子类中重写父类的final方法时,都会收到编译时错误。
E:\javasource>javac ChildClass.java
ChildClass.java:10: finalMethod() in ChildClass cannot override finalMethod() in
ParentClass; overridden method is final
final void finalMethod(){
^
1 error示例2:在子类中使用的父类最终方法(不覆盖)。
class ParentClass{
final void finalMethod(){
System.out.println("Hi,this is parent class final method");
}
}
class ChildClass extends ParentClass{
public static void main(String[] args){
ParentClass pc = new ParentClass();
pc.finalMethod();
}
}输出(描述)
只要我们不在子类中重写父类final方法,那么就不会执行编译时错误父类final方法。
E:\javasource>java ChildClass Hi,this is parent class final method.
5)当一个变量声明为final时,我们不能重新分配相同的final变量(或再次更改final变量的值),因为它是固定的或恒定的。
示例:尝试重新分配最终变量。
class FinalVariable{
final int a = 10;
a = 20;
public static void main(String[] args){
System.out.println("Hi,"+a+" is final variable");
}
}输出(描述)
每当我们尝试重新分配最终变量时,就会得到编译时错误。
E:\javasource>javac FinalVariable.java
FinalVariable.java:11: cannot inherit from final FinalClass
class ChildClass extends FinalClass{
^
1 errorfinally
1)它是一个块。
2)finally块始终与trycatch相关联。
语法:
try{
//风险代码
}
catch{
//处理代码
}
finally{
//资源释放活动
}3)在异常处理中很有用,并用于维护清理资源(例如:关闭数据库的连接对象)。
4)无论是否引发异常以及是否处理异常,该块将始终执行。因为在此块中,我们维护资源释放活动,所以无论如何都应执行此块。
示例1:引发异常。
class TryCatch
{
public static void main(String[] args){
try
{
int a =5;
int b =0;
int c = a/b;
}
catch(Exception e)
{
System.out.println(e);
}
finally{
System.out.println("finally block will be executed whether exception raised or not");
}
}
}输出(描述)
在这里,异常在a/b语句中引发,并立即ctrl转移到catch块并打印所需的异常。
E:\javasource>java TryCatch java.lang.ArithmeticException: / by zero finally block will be executed whether exception raised or not
示例2:未引发异常。
class TryCatch
{
public static void main(String[] args){
try
{
int a =5;
int b =5;
int c = a/b;
System.out.println("no exception raised");
}
catch(Exception e)
{
System.out.println(e);
}
}
}输出(描述)
如果在try块中未引发Exception,则将不执行catch块。
E:\javasource>java TryCatch no exception raised
finalize()
这是一种方法。
在销毁任何对象以执行清理活动之前,垃圾收集器应执行此方法。这意味着该finalize()方法不能手动或由用户执行。
注意:当垃圾回收器将调用finalize()方法然后执行方法时,我们不能指望垃圾回收器的确切行为,我们不知道这就是为什么强烈建议使用finally块而不是finalize()方法进行清理活动的原因。