程序员面试金典-Java

2019年10月15日

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语句块的线程被杀死终止了;