静态变量/类变量的使用细节
定义语法:访问修饰符 static 数据类型变量名;
或static 访问修饰符数据类型 变量名;
访问方法:对象名.类变量名;
或者类名.类变量名;(Java设计者推荐使用在这个方式)
使用细节:
- 由于类加载时会在堆中创建一个对应的Class对象,也即类变量是随着类的加载而创建的,所以没有创建对象时也能访问。
- 静态变量的访问修饰符的访问权限和范围和普通属性是一样的。
- 类变量与实例变量(普通属性)的区别在于,类变量是该类的所有对象共享的,一个类只维护一份,因此静态成员不属于多态范畴,没有继承的说法。而实例变量是每个对象独享的。
- 类变量的生命周期是随类的加载开始,随着类消亡而销毁。
- 静态方法不具有多态性,所以也就不存在重写的说法,如果子类中静态方法的签名与父类中静态方法的签名相同,那么父类中的静态方法将被隐藏,而不是被重写。静态方法与变量是属于类的方法与变量。
比如说Manage extends Employee,则Manage也是一个Employee,所以子类能够调用属于超类的静态变量和方法。注意,子类调用的其实就是父类的静态方法和变量,而不是继承自超类的静态方法与变量。但是如果子类中有同名的静态方法与变量,这时候调用的就是子类本身的,因为子类的静态变量与静态方法会隐藏父类的静态方法和变量。(这里可以简单的理解为子类“共享”了父类的静态成员,可以通过
子类.静态成员
调用父类的静态成员)
静态变量/类变量的内存布局
静态变量存储的位置与JDK版本有关系
静态变量存储于静态域,对于JDK7之前的版本,静态域在方法区中
而对于JDK7以上版本,静态域存储于定义类型的Class对象(反射机制里的内容?暂时没学过)中的尾部,而Class对象存在堆中。