首页 - 信息 -  【Java 面试合集】final 以及finally 不同

【Java 面试合集】final 以及finally 不同

2023-09-26 17:07

final 以及finally 不同

1. 概述

嗨,大家好【Java 面试合集】又来了。今天给大家分享的主题是final 以及finally 不同.
很简单,但是确实很细节哦,好了废话不多说,让我们开始吧

2. final

首先我们要知道final 是一个修饰符,可以修饰属性,方法,类等

2.1 修饰成员属性

  • 修饰基本数据类型后,不能再次修改
  • 修饰引用数据类型后,不能修引用。但是可以修改对象内容

基本数据类型

public class Test001 {final int age = 10;age = 20; // 不能进行修改
}

一旦使用final 修饰基本数据类型后,不能再次修改。

引用数据类型

public class Test001 {final Person p = new Person();public void test002() {p = new Person(); // 报错。p.name = "20"; // 但是可以这样赋值}
}

2.2 修饰类

使用修饰符final 修饰类后,类不能被继承。

final class Parent001 {
}public class Test002 extends Parent001 {
}

2.3 修饰方法

使用修饰符final 修饰方法后,方法不能被重写

class Parent001 {public final void test001() {}
}public class Test002 extends Parent001 {public void test001() {}
}

2.4 修饰参数列表

修饰的参数列表,跟修饰成员属性保持一致的

public class Test003 {public static void main(String[] args) {test001(1, 2);}public static void test001(final int a, int b) {a = 2; // 不能重新赋值b = 3;}
}

2.5 常用方式

一般跟static 结合使用。用来给全系统提供常用。

public final class Math {public static final double PI = 3.14159265358979323846;
}

3. finally

  • 其实是try catch finally 关键字。其大概的含义是:无论是否异常,都会执行finally
  • finally 代码块 会在try 代码块的return之前执行。
  • 如果finally代码块进行返回了,try 代码块中就无法返回了

实例1

public class Test004 {public static void main(String[] args) {System.out.println(test001());}public static String test001() {try {System.out.println("test001-1");return "test001-1-r";} finally {System.out.println("test001-2");return "test001-2-r";}}
}

上述代码的打印结果如下:

# test001-1
# test001-2
# test001-2-r

通过上述示例,如果finally代码块返回值后,try 代码块就不会返回了

实例2

public class Test004 {public static void main(String[] args) {System.out.println(test001());}public static String test001() {try {System.out.println("test001-1");return "test001-1-r";} finally {System.out.println("test001-2");}}
}

上述代码打印结果如下:

// test001-1
// test001-2
// test001-1-r

上述示例代码说明:如果try代码块正常的话,finally 代码块是在return 之前执行的。

4. 总结

其实final 以及finally除了书写相似外,毛关系没有