final

final为java关键字, 可以作用于成员变量、方法、类上
1.作用于成员变量上, 基本类型则值不可修改, 如果成员变量为对象, 则该对象的引用不可修改.
2.作用于方法, 该方法不可被重写
3.作用于类, 该类不可继承

finally

异常处理的关键字, 无论异常是否发生, finally内逻辑总会执行.

finally 和 return 的执行顺序

1.一般使用逻辑, return在try-catch-finally之后, 证明, 无论是否异常, finally都会执行

  1. public class MainTest {
  2. public static void main(String[] args) {
  3. System.out.println(finallyTest());
  4. }
  5. private static String finallyTest() {
  6. try {
  7. System.out.println("处理逻辑");
  8. // int i = 1 / 0;
  9. } catch (Exception e) {
  10. System.out.println("异常逻辑");
  11. } finally {
  12. System.out.println("finally执行了");
  13. }
  14. return "最终return返回";
  15. }
  16. }

2.在try/catch内添加return
try/catch内的return执行完后会继续执行finally, 但是从打印结果来开, finally的语句先打印, 原因是因为 return的

  1. public class MainTest {
  2. public static void main(String[] args) {
  3. System.out.println(finallyTest());
  4. }
  5. private static String finallyTest() {
  6. try {
  7. System.out.println("处理逻辑");
  8. // int i = 1 / 0;
  9. return "try - return返回";
  10. } catch (Exception e) {
  11. System.out.println("异常逻辑");
  12. // return "catch - return返回";
  13. } finally {
  14. System.out.println("finally执行了");
  15. }
  16. return "最终return返回";
  17. }
  18. }

输出结果

  1. 处理逻辑
  2. finally执行了
  3. try - return返回

3.finally里面添加return语句
finally里面return执行完后会直接返回, 不会再执行try块中的return语句

  1. public class MainTest {
  2. public static void main(String[] args) {
  3. System.out.println(finallyTest());
  4. }
  5. private static String finallyTest() {
  6. try {
  7. System.out.println("处理逻辑");
  8. // int i = 1 / 0;
  9. return "try - return返回";
  10. } catch (Exception e) {
  11. System.out.println("异常逻辑");
  12. // return "catch - return返回";
  13. } finally {
  14. System.out.println("finally执行了");
  15. return "finally - return返回";
  16. }
  17. // return "最终return返回";
  18. }
  19. }

执行结果

  1. 处理逻辑
  2. finally执行了
  3. finally - return返回

4.finally内添加逻辑改变变量值
1).try中的return值只是暂时放在栈中, 所以最终返回的还是 10, finally中并没有改变其值
2).try中的return值如果是对象, 栈中存放的是对象的引用, 对象属性值还是可以通过finally修改

  1. public class MainTest {
  2. public static void main(String[] args) {
  3. System.out.println(finallyTest());
  4. }
  5. private static String finallyTest() {
  6. int temp = 10;
  7. try {
  8. System.out.println("处理逻辑");
  9. return "try - return返回: " + temp;
  10. } catch (Exception e) {
  11. System.out.println("异常逻辑");
  12. // return "catch - return返回";
  13. } finally {
  14. temp = 100;
  15. System.out.println("finally执行了");
  16. }
  17. return "最终return返回: " + temp;
  18. }
  19. }

输出结果

  1. 处理逻辑
  2. finally执行了
  3. try - return返回: 10
  1. public class MainTest {
  2. public static void main(String[] args) {
  3. Temp temp = new Temp();
  4. temp.temp = 1;
  5. System.out.println(finallyTest(temp).toString());
  6. }
  7. private static Temp finallyTest(Temp temp) {
  8. try {
  9. System.out.println("处理逻辑");
  10. return temp;
  11. } catch (Exception e) {
  12. System.out.println("异常逻辑");
  13. // return "catch - return返回";
  14. } finally {
  15. temp.temp = 100;
  16. System.out.println("finally执行了");
  17. }
  18. return temp;
  19. }
  20. }
  21. class Temp {
  22. int temp;
  23. @Override
  24. public String toString() {
  25. return "Temp{" +
  26. "temp=" + temp +
  27. '}';
  28. }
  29. }

打印结果

  1. 处理逻辑
  2. finally执行了
  3. Temp{temp=100}

finalize方法

Object类的方法, 子类可重写, 主要是垃圾回收时使用.