由静态修饰符static修饰的变量、常量、方法分别称为静态变量、静态常量和静态方法,它们都存放在内存的静态区,这些变量和方法由独立的生存周期。内存中静态区在整个程序运行结束后才会释放,因此处于静态区的变量和方法的生命周期是整个程序的生命周期。静态区的方法和变量是被共享的,调用时不需要创建对象再来调用,使用“类名.静态类成员(静态方法、静态变量和静态常量)”就可以调用了。

静态变量

用static修饰的变量就是静态变量(注意静态变量也分成员静态变量和局部静态变量,这里暂时不做详细讲述,没有特别说明一般指成员静态变量),比如:static int id;。静态变量是被本类及其它类共享的,都可以通过“类名.静态变量”来调用来改变静态变量的值。
image.png
代码说明:当在本类里面调用在本类定义的静态变量时可以不用写类名,但这里为了统一规范,建议写上类名。

注意:同一个类的不同实例对象,共用同一个静态变量,如果其中一个对象将其修改,另一个对象的静态变量也会更改。可以理解为静态变量的地址给了调用 它的类,这些类有权力修改静态变量,利用代码说明,如:
image.png
通过运行结果可以看到,实例化对象改变静态变量的值完全是改变了静态变量在内存中的值,但实例化对象调用成员变量却不会改变内存中成员变量的值。也就是说,静态变量的地址给了调用它的类或实例化对象,这些类或实例化对象有权力修改静态变量;但当实例化对象调用成员变量时,成员变量并没有把地址给实例化对象,实例化对象没有权力修改内存中成员变量的值,只能修改该对象自己调用处理的成员变量值。
注意:在第7 10行中使用了“对象.静态变量”的方法调用了静态变量,这是合法的,但通常不建议这样写,以免和非静态变量搞混。
image.png

静态常量

用final static修饰一个成员变量,那么这个成员变量就会变成一个静态常量,所有的类都可以使用静态常量,静态常量的值是不能被修改的。比如,圆类和常量都要用到PI这个常量,如果我们在球类里面定义静态常量PI,如:final static PI=3.14;(Java中规定静态常量要大写),这时就不必在不同类中定义这个常量了,其它类只需使用“类名.静态常量”来调用它就可以了,这样内存的空间的压力就会减少,不需要开辟多个空间存放代表一个意思的量。实例代码如下:
image.png
小提醒:4/3.0不要写出4/3哦!
运行结果:
image.png

静态方法

我们知道如果想要使用类中的成员方法,需要先将这个类进行实例化对象,但是当不想或者不能创建类的对象来调用该方法,我们这时就可以把这个方法定义成静态方法,直接通过“类名.静态方法”来调用。如:
image.png
其实我们常用的System.out.println()方法就是一个典型的静态方法,我们没有创建System的对象调用了该方法,类中的man方法同样也是静态方法。

Java代码中各区域的运行顺序

在类中除了成员方法和构造方法外,用static修饰的代码区域可以成为静态代码块,定义一块静态代码块,可以完成类的初始化操作。静态代码块在类声明时就会运行,其次时非静态代码块运行,然后是构造方法运行,最后是成员方法运行。代码证明如下:
image.png
可以清楚的看到调用成员方法是各个代码块的运行顺序。