在做Swing的时候,为了把通用的界面框架抽象出来,经常采用模板方法,但是由于界面组件的初始化及布局都在构造函数中实现,于是就出现了下面的调用顺序
1.子构造函数->2.父构造函数->3.子模板方法->4.子类的实例变量初始化,在子类模板方法中初始化子类中的实例变量(子类的界面组件)之后,子类开始初始化自己的实例变量,结果把在模板方法中已经初始化的实例变量又初始化了一遍。如果子类不对其实例变量做初始化,那么第4步也不会进行,也就避免了这个问题
这就引出了一个问题,初始化实例变量为null和不初始化实例变量有了区别,下面是对这个问题写的测试代码,注意子类Child中的ch实例变量
当Child的ch变量不初始化时的代码:
此时输出“Parent”
当Child的ch变量初始化为null时的代码:
此时输出“null"
结论:当变量没有初始化时,会在分配对象内存时将所有变量置为初始值,但是不会在构造时自动为其再初始化一遍;
当初始化变量时,首先在分配内存时将所有变量都置为初始值,并在构造时再执行其初始化语句;
如果是在构造函数中使用模板方法模式,那么就要注意:如果在模板方法里为子类的变量做了赋值操作,那么在定义该变量时千万不要初始化,即使是初始化为null也会导致该变量被重新赋值
分享到:
相关推荐
Java 变量初始化的时机可以分为两类:实例变量初始化和类变量初始化。 实例变量初始化 实例变量初始化可以在三个地方进行: 1. 定义实例变量的时候指定初始值; 2. 非静态初始化代码块中对实例变量指定初值; 3. ...
如果你选择不手动初始化,那么实例变量的初始值通常是`nil`或者对应类型的零值。 在Objective-C 2.0中,还引入了`nonatomic`和`atomic`属性,用于多线程环境下的实例变量访问。`nonatomic`提供了非原子性访问,性能...
本文将深入探讨结构的两种初始化方式:部分初始化和完全初始化,并通过实例分析其特点和注意事项。 首先,我们来看部分初始化。部分初始化是指在创建结构实例时只给一部分字段赋值,而其余字段保持默认状态。以下是...
理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...
2. **初始化列表初始化**:接着执行构造函数的初始化列表,其中的初始化顺序与成员变量声明的顺序一致,而不受初始化列表中实际顺序的影响。例如`A(int a_):a(a_){};` 3. **构造函数体内的初始化**:最后执行构造...
Java 类加载器静态变量初始化机制详解 Java 类加载器是 Java 语言的核心组件之一,负责将 Java 字节码文件加载到内存中,以便 JVM 可以执行它们。在 Java 中,类加载器是通过委派机制来实现的,即一个类加载器可以...
### 类变量与实例变量 #### 一、概念解析 在面向对象编程中,尤其是在Java这样的语言里,类变量(也称为静态变量)和实例变量是两个重要的概念。它们都存储了对象的状态信息,但有着本质的区别。 - **实例变量**...
通过实例说明初始化对程序的影响。 有许多书上说,变量最好要赋初值。但是为什么要初值呢?不赋初值可能会出现什么样的意外呢?以下就我在以51单片机为MCU,Keil为编译器看到的实现现象作分析。
3. 显示初始化:执行实例变量的显示赋值代码,这是在源代码中对实例变量的直接赋值。 4. 构造器执行:调用对应的构造器,执行构造器内部的代码。每个构造器都会隐式地在其开始处调用父类的构造器(通过super()或...
动态初始化是指在定义数组时不初始化数组的值,而是在后续的代码中初始化数组,例如:`int[] a; a = new int[5];`。 默认初始化 在 Java 中,数组的元素会被隐式初始化为默认值,例如整数数组的元素将被初始化为 0...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前设置一个常量数组,静态初始化块就是合适的选择。 ```java public class InitFiledBlockStatic { ...
在C/C++编程语言中,`typedef` 和 `struct` 是两种不同的声明结构体类型...而结构体初始化则涉及到成员变量的初始赋值,可以使用初始化列表来实现。在实际编程中,合理使用 `typedef` 可以提高代码的可读性和可维护性。
多个类加载的时候,不是依次初始化好每个类的静态数据,再初始化每个类的实例成员,而是初始化好第一个类的静态数据,实例变量,再初始化下一个类的静态数据,实例变量。 static 关键字不能应用于局部变量,因此它...
- 接口没有实例变量,所以不存在实例初始化阶段。接口的初始化只涉及到类加载和静态初始化。 6. **类初始化与类加载器**: - 类的初始化是由对应的类加载器触发的,当且仅当以下条件之一满足时: - 遇到new...
// 实例成员变量初始化 public static TestB b = new TestB(); public static void main(String[] args) { new TestOrder(); } } class TestA { public TestA() { System.out.println("Test--A"); } } ...
4. **子类非静态成员初始化**:接着是子类的非静态成员变量初始化。 5. **基类构造函数调用**:通过`super()`调用基类的构造函数。 6. **子类构造函数调用**:最后执行子类自身的构造函数。 ### 初始化过程详解 ##...
3. C初始化代码:在汇编语言初始化之后,C语言代码接手进一步的初始化任务,包括堆栈设置、全局变量初始化等。 4. Board-specific初始化:针对特定硬件板卡的初始化,如板级外设的初始化。 5. System Initialization...
在Java中,类的初始化通常发生在以下几个时刻:当类被首次加载、创建类的实例、访问静态变量或调用静态方法时。初始化过程包括了静态块和实例块的执行,以及构造函数的调用。静态初始化块用于在类加载时执行一次的...
实例变量是在实例创建时被初始化的,而静态变量是在类加载时被初始化的。静态变量可以被所有实例共享,而实例变量每个实例都有自己的副本。 在 Java 中,静态变量的初始化有两种方式:隐式初始化和显式初始化。隐式...