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

类变量的初始化机制

阅读更多
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。
分享到:
评论

相关推荐

    g++中的局部静态变量的初始化机制及线程安全

    g++中的局部静态变量的初始化机制及线程安全

    类实例化顺序讲解 附阿里巴巴一道笔试题

    对象创建和初始化过程3.1 new对象底层字节码指令分析3.2 对象初始化过程详解【重点】3.2.2 实例变量初始化顺序分析3.2.3 继承中实例变量初始化顺序四 类实例化顺序总结4.1 类初始化阶段4.2 对象的创建和初始化阶段...

    在MAX-IDE中自动初始化数据段

    程序和数据段机制能够在数据存储器自动声明变量位置,并以起始值对这些变量进行初始化。应用程序可以将这些变量值缓存在闪存内,并在需要时恢复这些数据。该方法允许基于汇编语言的应用程序充分利用MAX-IDE提供的...

    关于JVM的总结

    准备:正式为类变量分配内存,并设置变量初始值.这些变量都存储在方法区. 解析:将常量池中的符号引用替换为直接引用的过程,虚拟机不会重新再解析而是通过缓存去拿出解析的数据 初始化:在准备阶段已经赋过一个系统...

    【04-面向对象(上)】

    成员变量不用显式初始化,只要定义了一个类属性或实例属性,系统 默认进行初始化。 局部变量 •局部变量可分为三种:  –形参  –方法局部变量  –代码块局部变量. •与成员变量不同的是除了形参外,其他...

    SilkTest天龙八部系列1-初始化和构造函数

    SilkTest天龙八部系列1-初始化和构造函数 软件测试 SilkTest没有提供专门的构造函数机制,但是在类对象生成的过程中,会先初始化在类中申明的变量。我们可以在初始化该变量的时, 调用某些函数完成对象初始化工作...

    JAVA实验报告

    (一) 声明不同数据类型的变量 4 (二) 了解变量的使用范围 5 (三) 使用关系运算符和逻辑运算符 5 (四) 使用表达式语句与复合语句 6 (五) 使用选择语句 6 (六) 使用循环语句 8 实验2 面向对象编程 11 一、...

    深入浅出类加载机制

    类加载机制1.1 加载1.2 验证1.3 准备1.4 解析1.5 初始化1.5.2 为什么静态方法不能调用非静态方法1.6 使用1.7 拆卸2. 类加载器2.1 类加载器种类2.1.1 Java虚拟机自带的类加载器2.1.2 用户自定义的类加载器2.2 双亲...

    java学习笔记-java思维导图流程图表格整理

    三种初始化 25 静态初始化 26 动态初始化 26 默认初始化 26 数组的四个基本特点 27 二维数组 27 Arrays类 28 稀疏数组 29 面向对象编程 32 值传递和引用传递 33 创建和初始化对象 34 封装 34 继承 37 super 37 方法...

    Linux线程同步之条件变量

     条件变量的初始化 pthread_cond_init  去除初始化 pthread_cond_destroy  等待 pthread_cond_wait  满足条件给向进程发送信号 pthread_cond_signal  下面程序展示了利用条件变量等待另外两个线程满足条件...

    C/C++程序内存的各种变量存储区域和各个区域详解

    C语言在内存中一共分为如下几个区域,分别是:1....全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起;普通局部变量保存在堆栈中;全局变量和局部变量在内存里的区别?一个由c/C++

    Java类加载机制浅析

    3、初始化(Initialize) 4、类加载器ClassLoader  4.1类加载器分类  5、双亲委派机制   5.1、检查某个类是否已经加载   5.2、加载顺序  5.3、打破双亲委派机制 所谓类加载机制就是 虚拟机把Class文件加载到...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    JavaSE基础学习笔记

    三种初始化 数组的四个基本特点 数组边界 数组使用 多维数组 Arrays类 冒泡排序 稀疏数组 面向对象编程 初识面向对象 面向过程 &面向对象 什么是面向对象 方法回顾和加深 对象的创建分析 类与对象的关系 创建与初始...

    【05-面向对象(下)】

    •成员变量是随类的初始化或对象初始化而初始化的。final修饰的成员变量必须由程序员指定初始值。 •对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    C++函数和数组

    1.掌握函数的定义和使用方法;掌握函数调用的方法;掌握函数参数传递的机制;...2.熟练掌握一维数组和二维数组的定义、引用和初始化;掌握字符数组与字符串的关系以及字符串变量的表示,熟练字符串处理函数的应用。

    matlab复现,考虑综合需求响应和阶梯型碳交易机制的综合能源系统优化调度策略 关键词,综合能源系统,碳交易机制,综合需求响应

    1. 初始化各个变量和常量,包括电力负荷、能源预测数据、能源设备的特性参数等。 2. 定义各种约束条件,包括能源设备的运行限制、负荷需求的平衡、能源储存设备的容量限制等。 3. 定义目标函数,包括能源成本和碳...

Global site tag (gtag.js) - Google Analytics