静态初始化器

1、静态初始化器是由static修饰的一对花括号“{}”括起来的语句组。它的作用和构造方法有待你相似,都是用来完成初始化工作的,但是静态初始化器与构造方法有以下几点根本不同。

a、构造方法是对每一个新创建的对象初始化,而静态方法是对类自身进行初始化。

b、构造方法是在new运算符创建新对象的时候由系统执行,而静态初始化器一般不能由程序调用,它是在所属类被加载入内存时由系统调用执行的。

c、用new运算符创建多少个新的对象,构造方法就被调用那个多少次,但是静态初始化器则是在被类加载入内存时只执行一次,与创建多少个对象无关。

2、如果有多个静态初始化器,则它们在类的初始化时会依次执行。

3、类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中得所有可能用到的类。

4、静态初始化器的作用是对整个类完成初始化操作,包括给static成员变量赋初值,它在系统向内存加载时自动完成。

5、例子

public class HelloB extends HelloA{

public HelloB()

{

}

{

System.out.print("I‘m B class");

}

static

{

System.out.print("Static B");

}

public static void main(String[] args)

{

new HelloB();

}

}

class HelloA

{

/**

* 构造方法,可以用来初始化该类的实例属性,也可以初始化类对象

*/

public HelloA()

{

}

/**

* 初始化块,只能用于初始化该类的属性

*/

{

System.out.print("I‘m A class");

}

/**

* 静态初始化器,对整个类就完成初始化操作,包括给成员变量赋值

*/

static

{

System.out.print("Static A");

}

}

时间: 2024-11-26 01:30:06

静态初始化器的相关文章

Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块 静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值. 2. (非静态)初始化块 (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值. 3. 构造方法 构造方法在每次生成实例对象时都执行一次 4. 执行顺序:静态初始化块 --> 初始化块 --> 构造方法 测试代码如下: 1 public class Son extends Father { 2 static int sNum = 0; 3 int num =

静态初始化中不能放入繁重计算,否则会变慢!

在类初始化期间计算不可变数据结果,并将结果保存在static final字段中是一种非常常见的做法.实际上,这正是静态初始化器的设计目标. 以下是在初始化时构建一些静态表的典型示例: public class StaticExample { static final long[] TABLE = new long[100_000_000]; static { TABLE[0] = 0; for (int i = 1; i < TABLE.length; i++) { TABLE[i] = nex

C# 9 提案:模块初始化器

模块初始化器提案已经被提升到 C# 9 候选资格.它就像 C#中的静态构造函数,但不是应用于一个类,而是应用于整个程序集. 这个特性从一开始就存在于 CLR 中,但是直到现在还没有被 C#公开.根据模块初始化器提案,它将作为对静态构造函数语法的修改而公开. 复制代码   [module: ModuleInitializer(typeof(MyModuleInitializer))]   internal static class MyModuleInitializer   {   static

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

C++静态初始化的顺序

这两天项目代码中遇到一个很疑惑的问题,问题可以描述为:一个静态成员初始化的时候直接core掉,该静态成员初始化时通过另外一个文件中静态成员来完成.该问题同样发生在全局对象上.该问题可以描述为今天要讨论的:变量的静态初始化顺序. 具体可以用代码简述如下: //test1.cpp #include <string> std::string a = "test"; //test2.cpp #include <iostream> extern std::string a

Asp.net Mvc 数据库上下文初始化器

在Asp.net Mvc 和Entity FrameWork程序中,如果数据库不存在,EF默认的行为是新建一个数据库.如果模型类与已有的数据库不匹配的时候,会抛出一个异常. 通过指定数据库上下文对象初始化器,可以执行删除和重新创建数据库,并用种子方法填充数据库. 当Asp.net Mvc 应用程序每一次运行的时候,Entity Framework 能够自动创建(或者删除重新创建)数据库.你能够指定每一次程序运行的时候,或者模型与已有数据库不匹配的时候执行 删除重新创建操作,通过指定Seed 方法

C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该方法已过期的警告,如下图: 又如,在.Net Re

4.8static关键字,4.9嵌套类,4.10匿名累,4.11对象初始化器

4.8主要讲了static关键字,并且具体介绍了静态字段,静态属性,静态方法,静态类,静态构造方法,单例模式,具体是采用什么方式访问的. 4.9介绍了一个概念叫嵌套类,类定义在另一个类的内部,由于嵌套类被声明的位置比较特殊,致使其访问权限与引用方式与普通类有所区别. 4.10匿名类:使用匿名类的方式创建实例,可以将一组只读属性封装到单个对象中. 4.11对象初始化器:对象初始化器可以有效解决一个类中属性过多的问题. 原文地址:https://www.cnblogs.com/ma214zq/p/1

C++静态初始化的顺序(转)

这两天项目代码中遇到一个很疑惑的问题,问题可以描述为: 一个静态成员初始化的时候直接core 掉,该静态成员初始化时通过另外一个文件中静态成员来完成 .该问题同样发生在全局对象上.该问题可以描述为今天要讨论的: 变量的静态初始化顺序 . 具体可以用代码简述如下: //test1.cpp #include <string> std :: string a = "test"; //test2.cpp #include <iostream> extern std::s