Java Singleton 模式与继承执行顺序解析

3星 · 超过75%的资源 需积分: 9 3 下载量 149 浏览量 更新于2024-07-27 收藏 283KB PDF 举报
"Java笔试编程题" 在Java编程面试或笔试中,Singleton模式和类的执行顺序通常是常见的考察点。让我们深入理解这两个知识点。 首先,我们来看Singleton模式。Singleton模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,有几种实现Singleton的方式: 1. 饿汉式(Eager Initialization):在类加载时就完成了实例化,线程安全,但可能导致资源浪费。 ```java public class Singleton { private static Singleton instance = new Singleton(); // 静态初始化 private Singleton() {} // 私有构造器 public static Singleton getInstance() { return instance; } } ``` 在这个例子中,Singleton实例在类加载时就创建了,所以即使没有调用`getInstance()`,实例也已经存在。 2. 懒汉式(Lazy Initialization):只有在首次调用`getInstance()`时才创建实例,提高了效率但不线程安全。 ```java public class Singleton { private static Singleton instance = null; private Singleton() {} public static synchronized Singleton getInstance() { // 同步方法 if (instance == null) { instance = new Singleton(); } return instance; } } ``` 这里的同步关键字`synchronized`保证了多线程环境下的线程安全,但会降低性能,因为每次调用`getInstance()`都需要进行同步。 3. 双检锁/双重校验锁(DCL,Double-Check Locking):结合了前两种方式的优点,既延迟初始化,又保证了线程安全。 ```java public class Singleton { private volatile static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { // 第一次检查 synchronized (Singleton.class) { if (instance == null) { // 第二次检查,避免不必要的同步 instance = new Singleton(); } } } return instance; } } ``` 这种方式是线程安全且高效的,`volatile`关键字确保了`instance`字段在多线程环境中的可见性。 接下来,我们讨论类的执行顺序问题。在Java中,当一个类被实例化时,会按照以下顺序执行: 1. 静态初始化块:如果类中有静态初始化块,它们会在类加载时按顺序执行,只执行一次。 2. 构造器:当创建一个新的对象时,构造器会被调用。 3. 实例初始化块:如果类中有实例初始化块,它们会在构造器之前执行。 给定的代码片段展示了父类`FatherClass`和子类`ChildClass`的构造器,当我们创建`ChildClass`的对象时,执行顺序如下: 1. 父类`FatherClass`的静态初始化块(如果有的话,这里未给出)。 2. `FatherClass`的构造器,打印`"FatherClassCreate"`。 3. 子类`ChildClass`的静态初始化块(如果有的话,这里未给出)。 4. `ChildClass`的构造器,打印`"ChildClassCreate"`。 这个例子是一个基础的继承概念,当创建子类对象时,会先执行父类的构造器(如果非私有),然后执行子类的构造器。这确保了对象的初始化按照正确的层次结构进行。