在学习 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成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。
偶对这个问题的理解可能不准确,欢迎大家拍砖。
分享到:
- 2009-05-20 14:32
- 浏览 1480
- 评论(0)
- 论坛回复 / 浏览 (0 / 2791)
- 查看更多
相关推荐
在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...
构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常用于类级别的初始化。 ### 构造函数与静态块的基本概念 构造函数是一种特殊的方法,它与类同名,并没有返回类型,其主要...
然而,在涉及到类继承时,一个重要的问题是类实例化时的初始化顺序。本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象...
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
从代码的执行结果可以看出,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。例如,在 `Cupboard` 类中,`b4` 和 `b5` 是两个静态变量,它们的初始化顺序是按照它们在类中的定义顺序进行的。 Java 静态数据...
在`Test.java`中,可能展示了这种初始化顺序。 总结,这个压缩包文件提供了关于Java中类和对象初始化的实例,包括静态和非静态成员的处理、继承、构造函数的调用顺序等。通过分析并运行这些代码,开发者可以更深入...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
6. **静态成员函数和实例成员函数**:静态成员函数在类加载时就已经初始化,而实例成员函数则在对象实例化时初始化。例如,`getSuperStaticNumber()`和`getSuperInstanceNumber()`分别在静态初始化和实例初始化阶段...
程序通过一系列输出语句来展示类成员变量、静态成员变量以及构造函数的初始化顺序。下面将逐一分析这些步骤,并解释为何会按照这样的顺序进行。 ### 初始化顺序解析 #### 静态成员变量与静态初始化块 1. **父类...
在上面的例子中,`Inner inner(5)`就是在外类`Outer`的构造函数初始化列表中调用了`Inner`的构造函数。 构造函数的初始化表达式还可以与C++的聚合初始化、列表初始化和默认构造函数相结合。聚合初始化允许你使用大...
静态变量的初始化是在类加载时完成的,而实例变量的初始化则在对象创建时进行。 在实际开发中,对ClassLoader的理解有助于解决一些特定场景的问题,比如热部署、插件系统或隔离不同版本的库。同时,掌握类变量初始...
初始化顺序方面,同一编译单元内的全局变量按照声明顺序进行初始化,但不同编译单元间的全局变量的初始化顺序是不确定的,这可能导致潜在的问题。如果全局变量之间存在依赖关系,最佳实践是重构代码以消除这种依赖。...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
当创建一个对象时,首先会按声明顺序初始化其所有非静态数据成员。每个数据成员如果是一个类类型,那么它的构造函数会被调用。这个过程被称为成员初始化列表。例如,如果有这样的类定义: ```cpp class ...
静态初始化块的执行顺序是在类加载时执行的,而不是在实例化对象时执行的。静态初始化块的执行顺序是从上到下依次执行的,先执行父类的静态初始化块,然后执行子类的静态初始化块。 在Java中,静态初始化块的执行...
在修改后的 `Cow` 类中,当尝试给 `count` 或 `whatever` 赋值时,静态构造函数会先执行,确保这些静态变量的初始化。 总结一下,C# 中的静态类提供了无需实例化即可使用的功能,它们通常用于工具类或提供全局服务...
构造函数是在创建对象时执行,而静态初始化块是在类加载时执行。两者不会相互影响,它们各自负责不同的初始化任务。 4. **多线程环境**:如果多个线程同时加载同一个类,静态初始化块会被同步执行,确保线程安全。...