Java 基础知识
final、 finally、 finalize
-
关键字final
Java语言的关键字final用于变量、类或方法时,含义各不相同。- 基本类型(primitive)变量: 一旦初始化,变量值就不能修改
- 引用(reference)变量: 该引用变量不能指向堆上的任何其他对象
- 方法: 该方法不能被子类重写(override)
- 类: 该类不能派生子类
-
关键字finally
关键字finally 和 try/catch 语句块配对使用, 即使有异常抛出,也能确保一段代码一定会执行。
finally 语句块会在 try/catch 语句块之后,在控制权交回之前执行。
public class FinallyTest {
public static void main(String[] args) {
System.out.println(testFinally(1));
}
private static int testFinally(int number){
try{
System.out.println("pre:" + number);
return number++;
}catch (Exception e){
e.printStackTrace();
return number;
}finally {
System.out.println("finally:" + number);
}
}
}
result:
pre:1
finally:2
## 如果 return 语句中含有计算, finally会在计算完成后,返回结果前获得执行权。
- finalize 方法
在真正销毁对象之前,自动垃圾收集器会调用 finalize() 方法。
因此,一个类可以重写 Object 类的 finalize() 方法, 以便定义在垃圾收集时的特定行为。
重载与重写
- 重载(overloading): 是指两个方法的名称相同,但参数类型或个数不同。
- 重写(overriding): 是指某个方法与父类的方法拥有相同的名称和函数签名。
Questions:
Q1: 从继承的角度来看, 将构造函数声明为私有会有何作用?
将构造函数声明为私有(private),可确保类以外的地方都不能直接实例化这个类。 在这种情况下,要创建这个类的实例,唯一的方法是提供一个公共静态方法, 就像工厂方法模式。 此外,由于构造函数是私有的,因此这个类不能被继承。
Q2: 在Java中,若在try-catch-finally的try语句块中插入return语句, finally 语句块是否还会执行?
会执行。当退出try语句块时,finally语句块将会执行。 即使我们试图从try语句块跳出(包括return、continue、break 和任何异常),finally语句块仍将得以执行。
finally 语句块不会执行的情况:
- 如果虚拟机在try/catch语句块执行期间退出;
- 如果执行try/catch语句块的线程被杀死终止了;