比较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 error
4)当方法声明为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 error
finally
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()
方法进行清理活动的原因。