先谈static
static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其它static方法和static域
—摘抄自《Java编程思想》第四版86页#5.4.2 static的含义无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本数据类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的默认初始化的值就是null。
—摘抄自《Java编程思想》第四版95页#5.7.2 静态数据的初始化
由上面我可以总结出几点:
- static成员是所有类对象公共的
- static成员可以直接用类名调用,无需创建对象
- static方法中不能使用this关键字
那么还是不知道静态成员何时才会被初始化,虽然上面摘抄的第二段解释中说了静态数据的初始化,然而并没有说何时会进行初始化,那么倒底何时初始化?
在谈static成员何时初始化
遇到这种问题,我们可以反过来推,那么怎么推?根据什么推?
相信大家都做过数学的求证题,那么这种题目都有一个特征,那么就是会提供至少一个或多个已知条件。好,那么我们来找找我们需要的已知条件
条件:static成员可以直接用类名调用,无需创建对象
从上面的条件中我们可以得知哪些信息了?
- 可以直接用类名调用
- 不需要创建任何对象就可以调用
我们在试想,当我们直接用类名去调用一个静态成员的时候,这个静态成员肯定必须要在我们调用之前就要被初始化好,那么也就是说在类被加载的时候就会被初始化好,因为在类被装载到jvm虚拟机后,如果不初始化static修饰的成员,那么就不能正确的使用类名去调用静态成员了{类(class)什么时候被加载?}
总结
一句话:类中的静态成员会随着类的加载而加载