静态属性静态方法与静态初始化器的区别(静态类初始化方法)
导语:静态属性、静态方法与静态初始化器
静态属性、静态方法与静态初始化器
static称为静态修饰符,它可以修饰类中的属性和方法。
1.静态属性
被static修饰的属性称为静态属性,这类属性一个最本质的特点是:它们是类的属性,而不属于任何一个类的具体对象。换句话说,对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。
静态属性节省空间;静态属性保持类对象的一致性修改
2.静态方法
static修饰符修饰的属性是属于类的公共属性:与之相仿,用static修饰符修饰的方法,是属于整个类的类方法;而不用static至少有三重含义:
(1)调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;
(2)非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有:
(3) 由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量。也即,static方法只能处理static的数据。
3.静态初始化器
静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都用来完成初始化的工作,但是静态初始化器与构造函数有三点根本的不同:
(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化;
(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;
(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。
4.java类中的静态变量是什么时候初始化的
我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。
在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。
连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。
解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非常量静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
初始化一个类包括两个步骤:
1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2、 如果类存在一个初始化方法,就执行此方法
本文内容由小涵整理编辑!