Java中final Vs finally Vs finalize区别

时间:2020-01-09 10:34:57  来源:igfitidea点击:

Java中final,final和finalize之间的差异是一个重要的访谈问题。一个原因是,这些词听起来很相似,另一个原因是,它使面试官有机会拓展到许多其他领域。从最后开始,我们可以继续讨论继承或者方法重写。从最后开始,我们可以开始处理异常。从finalize方法,我们可以讨论Object类。因此,我们只会看到一个问题,最终Vs最终Vs在Java中最终确定具有如此巨大的潜力!

现在,当这些单词的重要性在Java中最终确定,最终确定和最终确定之后,让我们尝试获取有关它们的一些详细信息。

它们之间的不同点是final和final是Java中的保留关键字,而另一方面finalize()是一种方法。虽然当我们谈论final时通常会说" finally块",因为我们将编写一个包含在final范围内的代码块。 。

Java中final Vs finally Vs finalize比较

final – final关键字限制对变量,方法或者类的访问。
当final与变量一起使用时,该变量的值一旦初始化就无法更改。
当方法声明为final时,该方法不能被任何子类覆盖。
当某个班级宣布为最终班级时,该班级将无法扩展。

final变量示例

public class FinalVar {
	public static void main(String[] args) {
		final int test = 7;
		// modifying final variable
		test++;
	}
}

这里的test是最终变量,因此更改其值将导致编译时错误"最终局部变量test无法分配。它必须为空并且不能使用复合分配。"

final方法示例

class Read {
  public final void readFile() throws IOException{
    System.out.println("read file");
  }
}

public class FileRead extends Read {
  // Overridden method
  public void readFile() throws IOException{
    File file = new File("D://test.txt");
    BufferedReader br = new BufferedReader(new FileReader(file));
  }
}

在这里,readFile()在父类Read中被标记为final,因此尝试在子类FileRead中覆盖它会导致编译时错误"无法从Read中覆盖final方法"。

final类示例

final class Read {
	public void readFile() throws IOException{
		System.out.println("read file");
	}
}

public class FileRead extends Read {
  ...
  ...
}

在这里,Read类标记为final,因此无法将其归类。试图扩展Read类的FileRead类将导致编译时错误" FileRead类型不能将最终类Read子类化"。

最终–最终关键字是Java中异常处理的一部分。它与try-catch块一起使用。无论是否在try块中包含的代码中引发了异常,始终执行在finally块中包含的代码。

如果try块内没有抛出异常,则try块存在时将执行finally块。
如果在try块中引发了异常,并且有一个catch块与所引发的异常的异常类型相匹配,则catch块首先执行,然后是finally块。
万一catch块无法处理引发的异常,则在方法返回之前,仍然会执行block。

因为可以保证将始终执行finally块,所以它用于放置清理代码。如果在代码中创建了用于读取或者写入文件的任何输入或者输出流,或者已打开数据库连接,那么最后块是关闭这些资源的安全位置。

Java Finally示例程序

public class FileRead {
  public void readFile(){
    BufferedReader br = null;
    try{
      br = new BufferedReader(new
          InputStreamReader(new FileInputStream(new 
              File("D:\test1.txt"))));
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      try {
        br.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  
  public static void main(String[] args) {
    FileRead fr = new FileRead();
    fr.readFile();    
  }
}

finalize –垃圾回收器线程在垃圾回收任何对象之前调用finalize()方法。
finalize方法作为受保护的方法存在于Object类中,其语法如下

protected void finalize() throws Throwable

由于finalize方法在Object类中,因此它被Java中的每个类继承。 Object类中的finalize方法没有实现,因此需要清理的类必须重写它才能执行清理或者处理系统资源。

Java Finalize方法示例

public class FinalizeExample {
  int num;
  FinalizeExample(int num){
    this.num = num;
  }
  public static void main(String[] args) {
    FinalizeExample obj1 = new FinalizeExample(5);
    FinalizeExample obj2 = new FinalizeExample(5);
    // object reference set as null explicitly
    // that makes it eligible for garabge collection
    obj1 = null;
    obj2 = null;
     // System.gc() call request to run garbage collector
    System.gc();
  }
	
  @Override
  protected void finalize() throws Throwable {      
    System.out.println("finalize method called for FinalizeExample object");       
  }
}

输出:

finalize method called for FinalizeExample object
finalize method called for FinalizeExample object