`

静态函数在类对象初始化时的执行顺序

    博客分类:
  • Java
阅读更多
在学习 Design&Pattern 的 Singleton Pattern 的时候,因为静态初始化是在 Java/.NET 中实现 Singleton 的首选方法.
静态构造函数和实例化对象时的构造函数有什么区别,它们的关系又是什么呢?
请看下面这个例子。
class Statics
{
    public static int count = 0;
    static //Statics()
    {
        count++;
	System.out.println("In static:" + count);
    }
    public Statics()
    {
        count++;
	System.out.println("In constructor:" + count);
    }

    public static void main(String[] args)
    {
	Statics o1 = new Statics();	
	Statics o2 = new Statics();
    }
}

输出:
E:\Java\puzzle_code>java Statics
In static:1
In constructor:2
In constructor:3

1、静态成员的初始化语句会早于静态构造函数(Java中貌似没有)执行
2、在.Net中静态构造函数是由CLR调用执行的,所以静态构造函数只能是一个,同时不能还有   参数。那么静态构造函数相对于成员初始化的一些弊端都不复存在。
在Java中貌似没有静态构造函数这一说,但是有静态初始化函数。

分析此类问题,只要记住三点就行了:
1. 代码的执行顺序,代码在前的先执行;
2. 静态成员初始化语句要先于静态构造函数执行;
3. 静态成员初始化语句与静态构造函数只执行一次。

更多参考(援引别人关于C#静态函数的总结):
一个类的static构造函数在给定的应用程序域中仅执行一次。static构造函数由在应用程序域的下列事件的首次发生时触发:
1)该类的实例被创建。
2)任何一个static成员被引用
3)如果类包含执行入口Main方法,此类的static构造函数在Main方法被调用之前执行。
4)如果类包含任何staic成员,则这些static成员在static构造函数之前进行初始化。
5)如果类包含任何static方法,则这些static方法在static构造函数之后进行初始化。
6)对于存在多个static成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。

偶对这个问题的理解可能不准确,欢迎大家拍砖。
分享到:
评论

相关推荐

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

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    构造函数与静态块的执行顺序

    构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常用于类级别的初始化。 ### 构造函数与静态块的基本概念 构造函数是一种特殊的方法,它与类同名,并没有返回类型,其主要...

    类继承的初始化顺序类,继承的初始化顺序

    然而,在涉及到类继承时,一个重要的问题是类实例化时的初始化顺序。本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

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

    从代码的执行结果可以看出,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。例如,在 `Cupboard` 类中,`b4` 和 `b5` 是两个静态变量,它们的初始化顺序是按照它们在类中的定义顺序进行的。 Java 静态数据...

    类和对象的初始化过程.zip

    在`Test.java`中,可能展示了这种初始化顺序。 总结,这个压缩包文件提供了关于Java中类和对象初始化的实例,包括静态和非静态成员的处理、继承、构造函数的调用顺序等。通过分析并运行这些代码,开发者可以更深入...

    java代码的初始化顺序demo

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

    java对象的初始化顺序[参考].pdf

    6. **静态成员函数和实例成员函数**:静态成员函数在类加载时就已经初始化,而实例成员函数则在对象实例化时初始化。例如,`getSuperStaticNumber()`和`getSuperInstanceNumber()`分别在静态初始化和实例初始化阶段...

    类初始化顺序示例讲解

    程序通过一系列输出语句来展示类成员变量、静态成员变量以及构造函数的初始化顺序。下面将逐一分析这些步骤,并解释为何会按照这样的顺序进行。 ### 初始化顺序解析 #### 静态成员变量与静态初始化块 1. **父类...

    编程思想14章构造函数的初始化表达式

    在上面的例子中,`Inner inner(5)`就是在外类`Outer`的构造函数初始化列表中调用了`Inner`的构造函数。 构造函数的初始化表达式还可以与C++的聚合初始化、列表初始化和默认构造函数相结合。聚合初始化允许你使用大...

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

    静态变量的初始化是在类加载时完成的,而实例变量的初始化则在对象创建时进行。 在实际开发中,对ClassLoader的理解有助于解决一些特定场景的问题,比如热部署、插件系统或隔离不同版本的库。同时,掌握类变量初始...

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

    初始化顺序方面,同一编译单元内的全局变量按照声明顺序进行初始化,但不同编译单元间的全局变量的初始化顺序是不确定的,这可能导致潜在的问题。如果全局变量之间存在依赖关系,最佳实践是重构代码以消除这种依赖。...

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

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

    C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar

    当创建一个对象时,首先会按声明顺序初始化其所有非静态数据成员。每个数据成员如果是一个类类型,那么它的构造函数会被调用。这个过程被称为成员初始化列表。例如,如果有这样的类定义: ```cpp class ...

    简单了解java中静态初始化块的执行顺序

    静态初始化块的执行顺序是在类加载时执行的,而不是在实例化对象时执行的。静态初始化块的执行顺序是从上到下依次执行的,先执行父类的静态初始化块,然后执行子类的静态初始化块。 在Java中,静态初始化块的执行...

    浅析C#静态类,静态构造函数,静态变量

    在修改后的 `Cow` 类中,当尝试给 `count` 或 `whatever` 赋值时,静态构造函数会先执行,确保这些静态变量的初始化。 总结一下,C# 中的静态类提供了无需实例化即可使用的功能,它们通常用于工具类或提供全局服务...

    Java static静态初始快

    构造函数是在创建对象时执行,而静态初始化块是在类加载时执行。两者不会相互影响,它们各自负责不同的初始化任务。 4. **多线程环境**:如果多个线程同时加载同一个类,静态初始化块会被同步执行,确保线程安全。...

Global site tag (gtag.js) - Google Analytics