static :静态修饰符
static表示“全局”或者“静态”的意思。
static 可以修饰:
1、变量(所谓 class variable)
2、方法(所谓 class method)
3、代码块(所谓 block)
4、内部类(所谓 nested class)
Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,这样JVM就可以非常方便的访问他们
1、static变量
被static修饰的成员变量,叫做静态变量;没有被static修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝,JVM只为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配,可用类名直接访问(推荐),当然也可以通过对象来访问(不推荐)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
所以一般在有以下需求的时候使用静态变量:
(1)在对象之间共享值(2)为了方便的访问变量
2、static方法
静态方法可以直接通过类名调用,而不需要创建类的对象。
静态方法的内部不能调用实例变量和实例方法。
静态方法独立于实例,因此静态方法必须被实现。
静态方法不能使用this和super关键
问题:为什么Java的main方法是static的?答:为了使得在调用main方法之前不需要创建实例对象
3、static代码块
静态代码块是在类中独立于类成员的static语句块,可以有多个,它不在任何方法体内,JVM在加载类时会执行这些静态的代码块。多个static代码块,JVM会按照出现顺序执行,每个代码块只执行一次。静态代码块可以用来优化性能,因为它只会在类加载的时候执行一次。
static块示例:
public
class
Test {
Person person =
new
Person(
"Test"
);
static
{
System.out.println(
"test static"
);