最近面试,被问到一道题,父类和子类都有静态初始化块代码,
其中包含输出语句,先执行哪个。
因为从代码维护的角度,我一般只是在初始化静态容器数据时,使用static块,
所以并不是很清楚,直观的认为是先父类,后子类。
面试官说,父类的不会被执行。
心下存怀疑
回来写代码一试,果然如我所想。
可能面试官是在用spring容器时,又想用 static初始化块。
但是Spring中类的生存周期和bean的周期有很大间隔,可能漏看了……
代码如下
public class Aclass {
protected static Map<String, String> data;
static {
data = new HashMap<String, String>();
data.put("adfdasf","sdfadsf");
System.out.println("aclass");
}
}
public class BClass extends Aclass {
static Map<String, String> map;
static {
map = new HashMap<String, String>();
map.put("sdf","hhaha");
System.out.println("bclass");
}
public static void main(String[] args) {
BClass b = new BClass();
}
}
输出结果是
aclass
bclass
分享到:
相关推荐
Java编程语言中,类的初始化过程涉及到静态块(static block)、实例块(instance block)以及构造器(constructor)。这些块的执行顺序对于理解和编写复杂的Java程序至关重要,特别是在涉及继承关系时。下面我们将...
- 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...
2. **非静态成员和非静态初始化块**:接着,会先初始化父类的非静态变量和执行父类的非静态初始化块,然后才是子类的相应部分。"父类 --变量" 和 "子类 --变量" 在这里被初始化,接着执行各自的初始化块。 3. **...
3. **父类静态成员变量及初始化块**:如果当前类继承自另一个类,则父类的静态成员变量和静态初始化块会在子类之前被初始化。 4. **实例成员变量的默认初始化**:创建对象时,默认情况下,实例成员变量会被初始化为...
静态初始化块(也称为静态初始化器)是在类被加载并初始化时执行的,且只执行一次。它用于初始化类级别的静态变量。在`init`目录下的文件可能包含了不同静态初始化的示例。 3. **实例化阶段**: 当我们创建一个新...
这个顺序对于理解类的初始化过程非常重要,特别是在处理复杂的继承结构时,可能包含多个父类和多个子类的构造器,以及静态和非静态初始化块。确保理解这个顺序可以帮助避免潜在的运行时错误,例如,依赖于未初始化的...
总之,Java类继承初始化顺序涉及到静态和非静态初始化块、构造器的调用以及方法的覆盖。理解这些概念对于编写健壮的、易于维护的Java代码至关重要。在实际编程中,应合理利用继承特性,同时注意避免不必要的复杂性和...
而实例初始化块则在创建对象时按遇到的顺序执行,先父类后子类。在第二个示例中,输出顺序为`Father static!`、`Child static!`、`Father block!`、`Father Constructor!`、`Child block!`、`Child Constructor!`,...
父类的静态初始化块会先于子类的执行。 5. **实例初始化块**: - 实例初始化块在创建对象时执行,但它们是在构造函数之前执行的。因此,父类的实例初始化块会在子类的实例初始化块之前执行。 6. **访问控制和可见...
也就是说,先执行父类中声明的所有静态变量和静态初始化块,然后再执行子类中声明的静态变量和静态初始化块。这一点至关重要,因为静态成员的初始化可能会影响到类的全局状态,了解这一点对于防止数据竞争等问题至关...
3. **父类的非静态部分**:在创建子类实例时,首先执行父类的非静态变量初始化和非静态初始化块,然后调用父类的构造器。 4. **子类的非静态部分**:最后执行子类的非静态变量初始化和非静态初始化块,以及子类的...
在给定的例子中,无论父类还是子类,静态变量和静态初始化块都会按照它们在代码中的顺序依次执行。因此,我们看到"父类--静态变量"、"父类--静态初始化块"、"子类--静态变量"、"子类--静态初始化块"的输出。 2. **...
- **子类非静态初始化**:在父类初始化完成后,继续进行子类的实例初始化,包括子类的非静态初始化块和子类的非静态属性。`Son`类的非静态属性`b4`、非静态块以及`b5`的初始化按顺序进行,然后调用子类构造器`Test...
在 Java 中,父类的静态变量和静态初始化块会先于子类的静态变量和静态初始化块被初始化。这是因为父类的静态变量和静态初始化块是在父类被加载时被初始化的,而子类的静态变量和静态初始化块是在子类被加载时被初始...
2. **父类的非静态初始化块**:接着,如果父类有非静态初始化块(也称为实例初始化块),它会在父类的构造函数执行之前运行。这些块用于初始化父类的实例变量。 3. **父类的默认构造器**:然后,调用父类的默认构造...
子类的静态初始化块会在父类的静态初始化块之后执行,但非静态部分则有所不同,子类的非静态变量和初始化块会在父类的构造器之后执行。 对于静态变量和静态初始化块,以及非静态变量和非静态初始化块的顺序,它们并...
3. **初始化块与成员变量初始化的顺序**:如果静态成员变量定义与静态初始化块同时存在,则先执行静态成员变量的初始化;同理,对于非静态成员变量也是如此。 掌握这些原则可以帮助开发者更准确地控制类的初始化...
- **父类静态变量** 和 **父类静态初始化块**:先于子类的任何初始化。 - **子类静态变量** 和 **子类静态初始化块**:紧随父类的静态部分之后。 - **父类实例变量** 和 **父类实例初始化块**:在子类实例部分之前...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
例如,如果你在子类的静态初始化块中依赖于父类的非静态成员,那么必须确保父类的静态初始化已经在子类的之前完成。同时,如果你需要在子类的构造器中修改父类的实例变量,确保父类的构造器已经被调用过。