final

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

finally

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

finally 和 return 的执行顺序

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainTest {

public static void main(String[] args) {

System.out.println(finallyTest());
}

private static String finallyTest() {

try {
System.out.println("处理逻辑");
// int i = 1 / 0;
} catch (Exception e) {
System.out.println("异常逻辑");
} finally {
System.out.println("finally执行了");
}
return "最终return返回";
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainTest {

public static void main(String[] args) {

System.out.println(finallyTest());
}

private static String finallyTest() {

try {
System.out.println("处理逻辑");
// int i = 1 / 0;
return "try - return返回";
} catch (Exception e) {
System.out.println("异常逻辑");
// return "catch - return返回";
} finally {
System.out.println("finally执行了");
}
return "最终return返回";
}
}

输出结果

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MainTest {

public static void main(String[] args) {

System.out.println(finallyTest());
}

private static String finallyTest() {

try {
System.out.println("处理逻辑");
// int i = 1 / 0;
return "try - return返回";
} catch (Exception e) {
System.out.println("异常逻辑");
// return "catch - return返回";
} finally {
System.out.println("finally执行了");
return "finally - return返回";
}
// return "最终return返回";
}
}

执行结果

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MainTest {

public static void main(String[] args) {

System.out.println(finallyTest());
}

private static String finallyTest() {

int temp = 10;
try {
System.out.println("处理逻辑");
return "try - return返回: " + temp;
} catch (Exception e) {
System.out.println("异常逻辑");
// return "catch - return返回";
} finally {
temp = 100;
System.out.println("finally执行了");
}
return "最终return返回: " + temp;
}
}

输出结果

1
2
3
处理逻辑
finally执行了
try - return返回: 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class MainTest {

public static void main(String[] args) {
Temp temp = new Temp();
temp.temp = 1;
System.out.println(finallyTest(temp).toString());
}

private static Temp finallyTest(Temp temp) {
try {
System.out.println("处理逻辑");
return temp;
} catch (Exception e) {
System.out.println("异常逻辑");
// return "catch - return返回";
} finally {
temp.temp = 100;
System.out.println("finally执行了");
}
return temp;
}

}

class Temp {
int temp;

@Override
public String toString() {
return "Temp{" +
"temp=" + temp +
'}';
}
}

打印结果

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

finalize方法

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