static修饰符
static修饰符能够与属性、方法和内部类一起使用,表示是“静态”的。
类中的静态变量和静态方法能够与“类名”一起使用,不需要创建一个类的对象来访问该类的静态成员。所以static修饰的变量又叫做“类变量”。这与实例变量不同。实例变量总是用对象来访问,因为他们的值在对象和对象之间有所不同。
举例如下:
public
可以看出,对于静态变量s,我们没有创建实例,就能直接访问它。那如果是实例去访问呢?
public
事实上,对于静态方法也是如此:
public
从两种不同的方式去访问或者调用类的静态成员时,我们肯定会尽量少的去创建实例(需要耗内存)来访问或调用类的静态成员,而采取直接调用的方式。
static属性的内存分配
一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。
public
共享的概念我结合这段代码画出内存分配图解释一下:
当我们创建了类属性s=“静态属性被多个实例所共享!”后,当类装载后就会在内存中便会为这个Test类划分出一块静态存储区,里面存放的s的值,当我们分别创建实例t和t1后,在堆内存中则存放着他们各自的实例属性,以及关于s的引用,它们都指向了静态存储区的s,因此当我们改变s的值后,t.s和t1.s指向的值都会改变。
static属性变量的初始化
static的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static变量,它都会被初始化。简而言之,它在创建对象的之前,就会被初始化,且只被初始化一次。
static基本规则
1、一个类的静态方法只能访问静态属性
2、一个类的静态方法不能直接调用非静态方法
3、如果访问控制权限允许,static属性和方法可以是用类名加“.”的方式调用;当然也可以使用实例加“.”方式调用
4、静态方法中不存在当前对象,因此不能使用this关键字,当然也不能使用super
5、静态方法不能被非静态方法覆盖
6、构造方法不允许声明为static
注:非静态方法只限于实例,并只能通过实例引用被访问。
静态初始器——静态块
静态初始器(Static Initializer)是一个存在于类中方法外面的静态块。静态初始器仅仅在类装载的时候(第一次使用类的时候)执行一次。
静态初始器的功能:通常用来初始化静态的类属性。
参考理解可以看这位博主的博客:
[java]static关键字的四种用法 - dotgua - 博客园www.cnblogs.com静态import
总结如下:static的四种用途
1、用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享。
2、用来修饰成员方法,将其变为类方法,可以直接使用 “类名.方法名”的方式调用,常用于工具类。
3、静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键。
4、静态导包用法,将类的方法直接导入到当前类中,从而直接使用 “方法名”即可调用类方法,更加方便。