`
- 浏览:
150001 次
- 性别:
- 来自:
北京
-
class Price{
final static Price INSTANCE = new Price(2);
static double initPrice = 20;
double currentPrice;
public Price(double discount){
currentPrice = initPrice - discount;
}
}
public class PriceTest {
public static void main(String[] args){
System.out.println(Price.INSTANCE.currentPrice);
Price price = new Price(2);
System.out.println(price.currentPrice);
}
}
/***********/
输出结果:-2.0
18.0
下面从内存的角度分析这个程序。第一次用到Price类时,程序开始对Price进行初始化,初始化分为以下两个阶段。
1、系统为Price的两个类变量分配内存空间;
2、按初始化代码的排列顺序对类变量执行初始化;
在初始化第一个阶段,系统先为INSTANCE、initPrice 两个类变量分配内存空间,此时INSTANCE、initPrice 的值默认为null、0.0。接着初始化进入第二阶段,程序按顺序依次为INSTANCE、initPrice 进行赋值。对INSTANCE赋值时调用Price(2),创建Price实例,此时立即执行程序中粗体字代码为currentPrice进行赋值,此时initPrice类变量为0.0,因此,赋值的结果是currentPrice等于-2.0,接着程序再次将initPrice赋值为20,但是此时对INSTANCE的currentPrice实例变量已经不起作用了。
当Price类初始化完成后,INSTANCE类变量引用到一个currentPrice为-2.0的Price实例,而initPrice类变量的值为20.0。当再次创建Price实例时,该Price实例的currentPrice实例变量的值才等于20.0-discount。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...
标题中的“全局变量初始化导致的dll加载失败工程”是一个典型的C++编程问题,涉及到动态链接库(DLL)的加载机制以及全局变量的初始化顺序。在C++编程中,全局变量的初始化顺序是一个需要深入理解的概念,尤其是在...
Java 类加载器静态变量初始化机制详解 Java 类加载器是 Java 语言的核心组件之一,负责将 Java 字节码文件加载到内存中,以便 JVM 可以执行它们。在 Java 中,类加载器是通过委派机制来实现的,即一个类加载器可以...
在面向对象编程中,类继承是一种非常重要的概念。它允许我们定义一个基类或父类,并从中派生出子类或派生类。通过继承,子类可以复用(或...希望通过对这些知识点的学习,能够帮助读者更好地掌握类继承的初始化机制。
类的静态变量初始化是有序的,遵循类文件中的顺序,从上到下依次初始化。这一点在面试中可能会被问及,例如在给定的代码片段中: ```java public class Test { public static int a = 0; public static int b ; ...
总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
Java虚拟机(JVM)是Java程序运行的核心,它的内部机制包括了类的加载、链接、初始化等关键过程。在Java编程中,了解这些过程对于优化程序性能、理解和解决类加载问题至关重要。本文将深入探讨Java虚拟机中的类初始...
在Objective-C中,对象的初始化和实例变量的作用域是编程中的关键概念,对于理解和创建健壮的iOS和macOS应用程序至关重要。 首先,让我们深入理解对象的初始化过程。在Objective-C中,初始化通常涉及`init`方法。每...
- 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...
在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...
本教程将深入探讨C++类变量的声明、初始化、访问控制以及与Java类声明的差异。 在C++中,类变量声明通常在类的定义内进行,语法如下: ```cpp class ClassName { // 访问修饰符 数据类型 变量名; // 或者 数据...
值得注意的是,如果类的成员变量在类定义时没有初始化,或者使用了用户定义的默认值,那么在构造函数的成员初始化列表中必须显式提供这些成员的初始值。如果忽略了一个成员的初始化,编译器会报错,因为这是强制性的...
2. **实例变量和初始化块**:当创建子类对象时,先执行父类的实例变量初始化和初始化块,接着执行子类的实例变量初始化和初始化块。这是因为在创建子类对象时,首先会创建父类的部分,然后再创建子类的部分。 3. **...
Java 初始化块,也称为构造代码块,是Java编程语言中的一种特性,用于在对象创建时执行特定的初始化操作。...在编写代码时,应谨慎使用初始化块,确保它们符合设计需求,并避免与其他初始化机制产生冲突。
C++语言中的初始化成员列表是一种特殊的语法结构,它允许在构造函数中对类的成员变量进行初始化。这种机制可以解决一些特殊的问题,如成员变量是类类型且没有默认构造函数的类,或者const成员或引用类型的成员。 ...
在这个“易语言-易语言静态变量初始化”的示例中,我们将深入探讨易语言中的静态变量及其初始化。 静态变量在程序中扮演着重要的角色,它们具有持久性,即在函数或程序块执行期间被创建,但其生命周期远远超过函数...
4. **成员变量初始化**:成员变量可以在类的初始化块(也称为实例初始化块)或构造器中初始化。初始化块会在对象创建时执行,可以用来设置初始状态。 5. **静态变量和静态初始化块**:静态变量属于类,而非类的实例...