通常来说,当创建类时,就是在描述那个类的对象的外观和行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界使用。
有2种情形,上述方法是无法解决的。
一是:只想为某特定域分配单一的存储空间,而不去考虑究竟要去创建多少对象,甚至不需要去创建对象。
二是:希望某个方法不与包含它的类的任何对象关联在一起。也就是即不创建这个类的对象也能调用其中的方法。
当声明一个实物是static是,这个域或方法就意味中不与包含它的类的任何对象相关联。所以,即没有创建某个类的任何对象,也可以调用static方法和访问static域。通常,我们必须创建一个对象,并用创建的对象来访问其中的数据或方法。因为非static方法或域必须知道他们一起运作的对象。
当然,由于static方法使用前不需要创建任何对象;静态方法(比如main()方法)中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),如果要访问的话必须new一个对象出来,再调用,比如a.i,只能访问所属类的静态成员变量和成员方法。
在同一个类中存在一个static字段和一个非static字段,一个static方法和非static方法。static方法可以调用static字段,但不可以调用非static字段。非static方法可以调用static方法和非static字段。
只需要将static关键字放在定义之前,就可以第一静态字段和方法。例如一下定义static方法:
public class test {
static int i = 10;//static 字段
static void fun(){//static 方法
System.out.println(i);
}
public static void main(String[] args) {
System.out.println(test.i);//通过类名引用i
test t1=new test();
System.out.println(t1.i);//通过对象引用i
test t2=new test();
System.out.println(t2.i);//t1.i和t2.i指向同一存储空间,因此它们具有相同值10
test.fun();//通过类名引用fun()
t1.fun();//通过对象引用fun()
}
}
结果:

在这里t1.i和t2.i指向同以存储空间,所以输出的值相同。引用static字段的方法有两种,一种是像以上代码t1.i。另一种方法是直接通过类名引用像test.i;而这对非static成员则不行。使用类名来引用变量是首选方式,不仅是因为强调了static结构,而且在某些情况下它还为编译器进行优化提供了更好的机会。类似逻辑也适用于static方法。
尽管static作用于某个字段会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而对非static字段对每个类的对象都一个存储空间)。但是static作用于某个方法,差别却没那么大。static方法的一个重要用法就是不用创建任何对象就可以通过类名直接调用它。
至于static的初始化,见我别的博文,我有介绍过。