`
weick
  • 浏览: 70363 次
  • 性别: Icon_minigender_1
  • 来自: 天堂的隔壁
社区版块
存档分类
最新评论

有关静态数据的初始化

JVM 
阅读更多

1.初始化顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化),而后非静态对象。如果在main方法中存在静态域对象,则这些静态域对象对应的所有类在main方法开始之前都会被加载。
  
  2.静态初始化只有在必要的时刻才会进行。如果某静态对象存在于某个类中,只有这个类的对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
  
  3.在JVM载入类文件的时候,有关初始化的所有动作都会执行。因此,静态初始化只在class对象首次加载的时候进行一次。注意,如果没有显示地初始化静态变量,它们会已经在类文件第一次在被加载的时候被初始化。
  
  4.看下面的程序:
  
  

public class Singleton
 {
   
   int counter4=0;
   static Singleton obj=new Singleton();
   static int counter1;
   static int counter2=0;
   int counter3=0;
   public Singleton()
   {
      counter1++;
      counter2++;
      counter3++;
      System.out.println("Singleton()");
   }
   
   public static void main(String[] args)
   {
      System.out.println("counter1="+Singleton.counter1);
      System.out.println("counter2="+Singleton.counter2);
      System.out.println("counter3="+obj.counter3);
   }
  
}

   
由于Singleton中定义了静态对象,所以程序会先初始化静态对象,执行构造器,由于counter3和counter4都进行了显示初始化,所以在执行构造器之前会前执行counter4=0和counter3=0这两条语句,接着在执行构造器,构造器执行完后接着执行static int counter2=0这条语句,由于在构造器中counter1、counter2进行了运算(counter1已经被初始化为0),运算后它们的结果都为1,但是由于构造器执行完毕后接着在执行static int counter2=0,所以最后打印出来的出来的结果为:
  
 

/* Output:

   Singleton()
  counter1=1
  counter2=0
  counter3=1

*///:~

   
  注意counter2的值为0,而不是1。

分享到:
评论

相关推荐

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

    Java 静态数据初始化详解 在 Java 中,静态数据初始化是指在类加载过程中对静态变量的初始化。静态变量是在类加载时被初始化的,而不是在实例创建时。静态变量的初始化顺序是按照它们在类中的定义顺序进行的。 在 ...

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    C++类的静态成员初始化详细讲解

    首先,静态数据成员通常在类声明中被声明,然后在包含类方法实现的源文件中进行初始化。例如: ```cpp class Test { public: static int num; }; int Test::num = 0; ``` 在这个例子中,`Test`类有一个静态成员`...

    易语言静态变量初始化源码.zip

    在编程中,变量是存储数据的容器,而静态变量有别于普通变量,它的特点是生命周期较长且在程序执行期间只被初始化一次。在易语言中,静态变量的使用有以下几个关键点: 1. **声明与初始化**:在易语言中,静态变量...

    数组动态初始化与静态初始化的区别

    动态初始化: 手动输入数组的长度,由系统给出默认初始值.(只明确元素的个数,不明确具体的值) ...数组静态初始化: 数据类型[] 数组名=new 数据类型[]{元素1,元素2...} eg: int [] arry=new int[]={11,22,33}

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    静态数据成员与子对象

    在编程中,静态数据成员和静态成员函数是类的一个重要特性,它们与普通的成员变量和成员函数有所不同。静态数据成员属于类,而不是类的每个实例,这意味着所有类的实例共享同一份静态数据成员的副本。这使得静态数据...

    C++全局变量初始化的一点总结

    零初始化的变量通常存放在BSS段,而常量初始化的变量则位于数据段,这两个阶段的初始化在程序启动时自动完成。 动态初始化则涉及运行时的动作,比如需要函数调用或类构造函数的初始化。这些变量的初始化在main函数...

    java中类的初始化顺序

    类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础...

    实现易语言类静态数据成员的方法

    在易语言中,静态数据成员不能在类的实例化过程中直接初始化,而需要在类的代码段中使用`初始化`过程来设置初始值: ```易语言 .初始化 静态计数 = 0 // 初始化静态计数为0 ``` 访问静态数据成员时,不需要通过类...

    java数组初始化详解

    Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明、初始化和使用。 一...

    java代码-静态数据初始化

    在Java编程语言中,静态数据初始化...总结来说,`java代码-静态数据初始化`涉及Java编程中的静态变量声明、初始化以及相关的内存管理、生命周期和并发考虑。理解这些概念对于编写高效、安全的多线程Java程序至关重要。

    类的静态数据成员-用来统计对象存在的个数

    在描述中提到的问题,当尝试在头文件(例如`.h`或`.hpp`)中初始化静态数据成员时,如果该头文件被多个源文件(`.cpp`)包含,编译器会为每个包含它的文件分别创建一个静态成员的副本,从而导致“obj重复定义”的...

    易语言源码实现易语言类静态数据成员的方法.7z

    易语言中,静态数据成员的初始化通常在类的初始化代码块中进行。由于静态数据成员不是每个对象都有独立的副本,所以初始化只执行一次。例如: ```易语言 类 定义 名为 MyClass 静态 整数 变量 名为 staticValue ...

    Java static静态初始快

    这通常用于初始化静态变量或者执行一些类级别的设置工作,例如设置默认值、计算值或者建立静态数据结构等。 下面是一些关于Java静态初始化块的关键知识点: 1. **执行顺序**:静态初始化块在非静态初始化块之前...

    php 静态变量的初始化

    静态变量的初始化通常在声明时进行,但必须注意的是,它们只能被标量类型(如整型、浮点型、字符串和布尔型)初始化。这意味着你不能直接在声明时将静态变量设置为对象。例如: ```php class A { static public $...

    数据结构单链表初始化c/c++语言代码实现

    在C或C++中,理解并实现单链表的初始化对于深入学习数据结构至关重要。下面将详细介绍单链表的结构,以及两种在C++中初始化单链表的方法。 一、单链表的基本结构 1. 节点定义:在C++中,我们首先需要定义一个节点...

    Java中static静态变量的初始化完全解析

    1. **默认初始化**:当类被加载时,静态变量首先会被赋予其数据类型的默认值。例如,`int`类型的静态变量会被初始化为`0`,`boolean`为`false`,引用类型为`null`。 2. **显式初始化**:接着,按照静态变量在源代码...

Global site tag (gtag.js) - Google Analytics