static是一个静态修饰符,用于修饰成员(成员变量,成员函数)。《thinking in java》对staic的使用场景有下面2种定义:“一种情形是只想用一个存储区域来保存一个特定的数据—— 无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法”。。在类中,用static声明的成员变量成为静态成员变量,用static声明的方法即称为静态方法。对于static,它有如下几个特点:
1.随着类的加载而加载。
一旦static被创建,它会一直存在静态常量池中,知道程序执行完,随着类的消失而消失,它的生命周期相对来说是最长的。
2.优先于对象存在
静态是优先于对象存在的。
举个例子:
public class Demo { public static void main(String[] args) {
Test.name="hello";
Test.staticHello();//优于对象创建,所以可以直接调用static修饰的方法
//Test.age=0 //调用非静态变量age会报错,因为对象还未创建
Test t=new Test();//创建对象
t.age=18;//这个时候就可以调用非静态变量和方法
t.normalHello(); }
}
class Test{
static String name;
int age;
public static void staticHello(){
System.out.println("static name:"+name);
}
public void normalHello(){
System.out.println("normal age:"+age);
}
}
输出结果为:
static name:hello
normal age:18
从这个例子还可以看出,我们可以在没有创建对象的情况下,通过类名直接调用static修饰的方法和变量,所以可以得知,static是不依赖于对象存在的,即
3.被类的所有对象所共享
因此,静态的成员变量和方法也不能使用this,super关键字,这2个关键字都是基于对象的。
4.可以直接被类名所调用
在上述的例子中,可以看到static修饰的变量方法是直接通过类名Test调用出来的,当然,在创建对象之后,同样可以使用创建的对象去调用这个方法。
在不创建对象的情况下,静态方法不能访问类的非静态成员变量/方法,main方法就是一个静态方法,假如我们在Demo类里创建一个成员变量String names,要在main方法里直接取到这个值是不行的,如果没有创建对象,它就不能直接访问。而非静态方法可以访问静态成员/方法
《Thinking in java4》中“当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前没有使用static关键字”。因为静态方法可以在未创建对象时调用,从这个角度看,构造方法在对象未创建时调用,可以看作是静态方法。
但从另一个方面来看,静态方法不能调用实例方法,而构造方法可以调用实例方法,所以构造方法也不算是静态方法。