比较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块始终与try catch相关联。

语法:

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()方法进行清理活动的原因。