`
kingquake21
  • 浏览: 269011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实例变量初始化与不初始化的区别

阅读更多

在做Swing的时候,为了把通用的界面框架抽象出来,经常采用模板方法,但是由于界面组件的初始化及布局都在构造函数中实现,于是就出现了下面的调用顺序

1.子构造函数->2.父构造函数->3.子模板方法->4.子类的实例变量初始化,在子类模板方法中初始化子类中的实例变量(子类的界面组件)之后,子类开始初始化自己的实例变量,结果把在模板方法中已经初始化的实例变量又初始化了一遍。如果子类不对其实例变量做初始化,那么第4步也不会进行,也就避免了这个问题

这就引出了一个问题,初始化实例变量为null和不初始化实例变量有了区别,下面是对这个问题写的测试代码,注意子类Child中的ch实例变量

当Child的ch变量不初始化时的代码:

此时输出“Parent”

当Child的ch变量初始化为null时的代码:

此时输出“null"

结论:当变量没有初始化时,会在分配对象内存时将所有变量置为初始值,但是不会在构造时自动为其再初始化一遍;

当初始化变量时,首先在分配内存时将所有变量都置为初始值,并在构造时再执行其初始化语句;

如果是在构造函数中使用模板方法模式,那么就要注意:如果在模板方法里为子类的变量做了赋值操作,那么在定义该变量时千万不要初始化,即使是初始化为null也会导致该变量被重新赋值

分享到:
评论

相关推荐

    Java变量初始化

    Java 变量初始化的时机可以分为两类:实例变量初始化和类变量初始化。 实例变量初始化 实例变量初始化可以在三个地方进行: 1. 定义实例变量的时候指定初始值; 2. 非静态初始化代码块中对实例变量指定初值; 3. ...

    Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域

    如果你选择不手动初始化,那么实例变量的初始值通常是`nil`或者对应类型的零值。 在Objective-C 2.0中,还引入了`nonatomic`和`atomic`属性,用于多线程环境下的实例变量访问。`nonatomic`提供了非原子性访问,性能...

    C#中结构(struct)的部分初始化和完全初始化实例分析

    本文将深入探讨结构的两种初始化方式:部分初始化和完全初始化,并通过实例分析其特点和注意事项。 首先,我们来看部分初始化。部分初始化是指在创建结构实例时只给一部分字段赋值,而其余字段保持默认状态。以下是...

    探究java的ClassLoader及类变量初始化顺序

    理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...

    c++能不能给类的成员变量在声明的时候初始化? - life_limbo - 博客园1

    2. **初始化列表初始化**:接着执行构造函数的初始化列表,其中的初始化顺序与成员变量声明的顺序一致,而不受初始化列表中实际顺序的影响。例如`A(int a_):a(a_){};` 3. **构造函数体内的初始化**:最后执行构造...

    Java类加载器:静态变量初始化.docx

    Java 类加载器静态变量初始化机制详解 Java 类加载器是 Java 语言的核心组件之一,负责将 Java 字节码文件加载到内存中,以便 JVM 可以执行它们。在 Java 中,类加载器是通过委派机制来实现的,即一个类加载器可以...

    类变量和实例变量.txt

    ### 类变量与实例变量 #### 一、概念解析 在面向对象编程中,尤其是在Java这样的语言里,类变量(也称为静态变量)和实例变量是两个重要的概念。它们都存储了对象的状态信息,但有着本质的区别。 - **实例变量**...

    (单片机C语言)变量的初始化

    通过实例说明初始化对程序的影响。 有许多书上说,变量最好要赋初值。但是为什么要初值呢?不赋初值可能会出现什么样的意外呢?以下就我在以51单片机为MCU,Keil为编译器看到的实现现象作分析。

    类初始化和实例初始化1

    3. 显示初始化:执行实例变量的显示赋值代码,这是在源代码中对实例变量的直接赋值。 4. 构造器执行:调用对应的构造器,执行构造器内部的代码。每个构造器都会隐式地在其开始处调用父类的构造器(通过super()或...

    java数组初始化详解

    动态初始化是指在定义数组时不初始化数组的值,而是在后续的代码中初始化数组,例如:`int[] a; a = new int[5];`。 默认初始化 在 Java 中,数组的元素会被隐式初始化为默认值,例如整数数组的元素将被初始化为 0...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    Java静态初始化块和对象初始化块

    静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前设置一个常量数组,静态初始化块就是合适的选择。 ```java public class InitFiledBlockStatic { ...

    typedef struct 与 struct 的区别及初始化

    在C/C++编程语言中,`typedef` 和 `struct` 是两种不同的声明结构体类型...而结构体初始化则涉及到成员变量的初始赋值,可以使用初始化列表来实现。在实际编程中,合理使用 `typedef` 可以提高代码的可读性和可维护性。

    Java初始化顺序1

    多个类加载的时候,不是依次初始化好每个类的静态数据,再初始化每个类的实例成员,而是初始化好第一个类的静态数据,实例变量,再初始化下一个类的静态数据,实例变量。 static 关键字不能应用于局部变量,因此它...

    java程序初始化顺序

    - 接口没有实例变量,所以不存在实例初始化阶段。接口的初始化只涉及到类加载和静态初始化。 6. **类初始化与类加载器**: - 类的初始化是由对应的类加载器触发的,当且仅当以下条件之一满足时: - 遇到new...

    java中类的初始化顺序

    // 实例成员变量初始化 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. **子类构造函数调用**:最后执行子类自身的构造函数。 ### 初始化过程详解 ##...

    ARM初始化文件详解

    3. C初始化代码:在汇编语言初始化之后,C语言代码接手进一步的初始化任务,包括堆栈设置、全局变量初始化等。 4. Board-specific初始化:针对特定硬件板卡的初始化,如板级外设的初始化。 5. System Initialization...

    java 初始化与方法

    在Java中,类的初始化通常发生在以下几个时刻:当类被首次加载、创建类的实例、访问静态变量或调用静态方法时。初始化过程包括了静态块和实例块的执行,以及构造函数的调用。静态初始化块用于在类加载时执行一次的...

    学习java静态数据初始化.doc

    实例变量是在实例创建时被初始化的,而静态变量是在类加载时被初始化的。静态变量可以被所有实例共享,而实例变量每个实例都有自己的副本。 在 Java 中,静态变量的初始化有两种方式:隐式初始化和显式初始化。隐式...

Global site tag (gtag.js) - Google Analytics