首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么应该尽可能避免静态构造函数初始化静态字段

C#具有一个默认开启的代码分析规则:[CA1810]Initialize reference type static fields inline,推荐我们以内联的方式初始化静态字段,而不是将初始化放在静态构造函数...不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...从Foo和Bar的IL代码可以看出,针对它们静态字段初始化都放在静态构造函数。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。

16710

java类加载和初始化_java静态变量什么时候初始化

四、动态创建对象执行方法 一、类的加载与ClassLoader的理解 1、加载 将class文件字节码内容加载到内存,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class...3、初始化 执行类构造器()方法的过程。类构造器()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。...二、什么时候会发生类初始化 1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类; new一个类的对象; 调用类的静态成员(除了final常量)和静态方法; 使用java.lang.reflect...如:当通过子类引用父类的静态变量,不会导致子类初始化; 通过数组定义类引用,不会触发此类的初始化; 引用常量不会触发此类的初始化(常量链接阶段就存入调用类的常量池中了); 三、类加载器的作用 将class...文件字节码内容加载到内存,并将这些静态数据转换成方法区的运行时数据结构,然后堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

45220
您找到你想要的搜索结果了吗?
是的
没有找到

Java静态初始化和非静态初始化

Java初始化 Java与C++的一个不同之处在于,Java不仅有构造函数,还有一个“初始化块”(Initialization Block)的概念。...Java初始化创建Java对象时隐式执行,并且是构造函数之前执行。 2....静态初始化 // 定义 static { ... } 静态初始化块执行的优先级高于非静态初始化块,在对象装载到JVM时执行一次,仅能初始化类成员变量,即static修饰的数据成员。 3....非静态初始化 // 定义 { ... } 非静态初始化每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化构造函数之前执行。 4....静态初始化块是类相关的,系统将在类加载时执行静态初始化块,而不是创建对象时才执行,因此静态初始化块总是比非静态初始化块先执行。用途:例如在JNI调用时,需要加载动态链接库,就可以静态代码块中加载。

2.7K20

关于Java静态字段静态方法的讨论

静态字段 如果将一个字段定义为static,每个类只有这样一个的字段,而对于非静态的实例字段,每个对象都有自己的一个副本,例如:,假设需要给每个员工赋予唯一的标识码,这里给Employee类添加id和一个静态字段...表达式:Math.pow(x,a) 不难看出,完成运算的时候,他并没有使用Math对象,换句话说他没有隐式参数。可以认为静态方法是没有this参数的方法。...静态方法的俩种场景: 方法不需要访问对象状态,它所需要的所有参数都要通过显式参数提供Math.pow(3,5) 方法只需要访问类的静态字段(例子见下) public static int getId()...public static void main(String[] args){ } main方法不需要对任何对象进行操作,但是实际上,启动程序的时候,还没有任何对象。...静态的main方法将执行并构造程序所需要的对象 最后 本文为博主学习使用 参考书籍 ——java核心技术卷1

76640

深入理解Java静态初始化

Java,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义,用大括号{}括起来,静态代码块大括号外还要加上static关键字。...应用:将所有构造函数共性的东西定义构造代码块。...但是,如果只是这一点便利的话,还不足以使用初始化块,其实初始化块真正体现其独一无二的作用是匿名内部类,由于是匿名内部类,因而无法写构造方法,但是很多时候还是要完成相应的初始化工作,这时就需要用到初始化块了...2)静态代码块优先于构造代码块的执行 3)都定义,一个带static关键字,一个不带static 比如可以记录第一次访问类的日志,或方便单例模式的初始化等。...(创建类的实例时)先执行实例初始化块,再执行构造方法;但对于一棵继承树,会先调用父类的构造方法,那么其执行顺序也如句子所述。

70420

Java什么时候才要考虑线程安全

举一个例子:小明和小红同时访问同一个方法M(),而且他们不同的线程。小明所在的线程称为A线程,小红所在的线程称为B线程,线程A和线程B有一个共享的变量G。...AlbertYang ★Java什么时候考虑线程安全?...Java中有以下两种变量需要考虑线程安全问题: 1. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。 2....实例变量为对象实例私有,虚拟机的堆中分配,若在系统只存在一个此对象的实例,多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是不同的对象...★ Java主要通过以下两种方式解决线程安全问题: 1、同步方法 给多线程访问的成员方法加上synchronized修饰符 public void synchronized M(){ //

1.4K41

JavaJava类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

我们通过主方法运行Java程序,而这个主方法创建了i对象并且属于InitializeDemo 类,所以main方法执行时会将我们的类进行初始化。...我们的类第一次进行初始化的时候,我们类静态块和静态属性会被优先构建。之后才轮得到非静态块和非静态属性。...类的一个对象进行初始化,按照代码顺序从上往下先构建静态的属性、方法和静态块,之后构建非静态块和非静态属性。...(类静态块和静态变量只会初始化一次,也就是类第一次被用到的时候) 1、静态变量k被初始化 private static int k = 1; 2、静态变量t1初始化 private static...那么我们初始化t1的时候,就要从上向下找非静态块和非静态属性(如果有的话 ),最后执行构造方法。

20110

【测开技能】Java系列(三十)静态方法和静态字段

前一篇: 【测开技能】Java系列(二十 九)接口 这一篇,我们开始去分享静态方法和静态字段 ---- 正文 实例,我们可以给实例定义不同的字段。...实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。...那么如何定义静态字段呢 public static int price; 如何使用呢 public class Main { public static void main(String[...看下结果 可以看到,静态字段,一个类的实例化后修改了静态字段,这个类的其他实例化对应的这个静态字段的值也会发生变化的。...可以看到,静态字段不属于类实例独享的,而是共享的,有了静态字段,肯定有静态方法 如何定义静态方法呢 public static void setPrice(int price) { Manto.price

29020

Java类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

初始化过程是这样的: 1.首先,初始化父类静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介

31330

Python什么时候用Yield什么时候用Return

许多Python开发人员代码中使用yield,而不考虑他们是否真的需要。这篇文章解释了你什么时候应该使用它。 最近,我看到很多在结构中使用yield关键字的项目,无论是否需要。...函数定义中使用yield语句足以导致该定义创建生成器函数,而不是正常函数。 yield语句暂停函数的执行,并将值返回给调用者,但保留足够的状态以使函数能够恢复到停止的地方。...当恢复时,函数最后一次收益运行后立即继续执行。这允许它的代码随着时间的推移产生一系列值,而不是一次计算它们并将它们像列表一样发回。...[图片] yield语句不允许try ... finally结构的try子句中使用。难点在于不能保证生成器永远不会被恢复,因此不能保证finally组将被执行。...当我们想迭代一个序列,但不想将整个序列存储在内存时,我们应该使用yield。 yieldPython生成器中使用。

2.3K00

CA1810:以内联方式初始化引用类型的静态字段

规则说明 当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型的每个静态方法和实例构造函数添加一项检查,以确保之前已调用该静态构造函数。...静态初始化可以保证访问任何静态字段之前的某个时间发生,但不能在调用静态方法或实例构造函数之前发生。 请注意,声明类型的变量后,可能会随时发生静态初始化静态构造函数检查会降低性能。...通常,静态构造函数仅用于初始化静态字段,在这种情况下,必须确保仅在首次访问静态字段之前发生静态初始化。 beforefieldinit 行为适用于这些类型和大多数其他类型。...仅当静态初始化影响全局状态并且满足以下任一条件时,它才是不适当的: 影响全局状态的成本非常昂贵,如果不使用该类型,则不需要这样做。 可以不访问该类型的任何静态字段的情况下访问全局状态效果。...何时禁止显示警告 如果不考虑性能,或者,如果静态初始化导致的全局状态更改成本非常昂贵,或者必须保证调用该类型的静态方法或创建该类型的实例之前进行静态初始化,则可以安全地禁止显示此规则发出的警告。

60800

Java 静态属性与实例属性的初始化

类的初始化包括静态属性的初始化和实例属性的初始化加载类过程的准备阶段会给静态属性分配存储空间,并根据属性的类型设置初始值,例如 int 类型静态属性会设置初始值为 0,布尔类型静态属性会设置初始值为...加载阶段之后,会在内存中保存一个类的java.lang.Class对象,通过该Class对象来访问类的各项数据,包括静态属性。...,若父类还没有进行静态初始化,则会先进行父类的静态初始化子类实例属性初始化时,若父类还没有进行实例属性初始化,则会先进行父类的实例属性初始化。...,由此可知,示例代码静态变量 i,准备阶段默认值为 0。...通过该示例可知,静态代码块和静态变量定义的赋值操作区分前后顺序,这里有一点需要注意:静态代码只能访问定义静态代码块之前的变量,即不能访问未初始化的变量。

2.3K30

正确的初始化Java编程至关重要!

今天,我打算聊聊Java编程初始化。...01、使用构造器来确保对象初始化 Java编程,无论是对象,还是基本类型,都不允许未经初始化的情况下使用它们;否则,Java编译器就会热情地提醒你——请初始化后再使用。...那,Java是通过什么机制来确保对象初始化呢? 答案就是“构造器”——类的对象要被正确的初始化,就必须先过构造器这一关。...,否则编译器会提示“The constructor Writer() is undefined”(使用new Writer()创建对象对)——这样做的好处就是,确保对象初始化的时候符合类设计的初衷(上例...Java该如何区分重载方法(毕竟参数名相同)呢?上例,你也看到了,参数个数的不同就可以区分;另外,参数的类型和顺序(不建议使用,因为这样做会让代码难以维护,见下例)也可以用来作为区分的条件。

56021

详解Java静态方法

参考链接: Java静态类 定义: 类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存;而非静态方法属于对象的具体实例,只有类的对象创建时在对象的内存才有这个方法的代码段。...原因: 因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存,而非静态方法和非静态数据成员只有类的对象创建时在对象的内存才有这个方法的代码段。 ...    {         private static int a;         private int t=0;         //静态初始器:由static和{}组成,只类装载的时候(第一次使用类的时候...)执行一次,往往用来初始化静态变量。        ...(2)静态不能引用非静态这一特性,是由于静态的会随着类的定义而被分配和装载入内存这一关键点决定的;如果静态引用了非静态的,根本无法从内存中找到非静态的代码段,势必会出错,这种做法是Java虚拟机决不允许的

82920
领券