static是一个静态修饰符,用于修饰成员(成员变量,成员函数)。《thinking in java》对staic的使用场景有下面2种定义:“一种情形是只想用一个存储区域来保存一个特定的数据—— 不管要建立多少个对象,甚至根本不建立对象。另外一种情形是咱们须要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即便没有建立对象,也须要一个能调用的方法”。。在类中,用static声明的成员变量成为静态成员变量,用static声明的方法即称为静态方法。对于static,它有以下几个特色:html
1.随着类的加载而加载。java
一旦static被建立,它会一直存在静态常量池中,知道程序执行完,随着类的消失而消失,它的生命周期相对来讲是最长的。函数
2.优先于对象存在this
静态是优先于对象存在的。spa
举个例子:code
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); } }
输出结果为:orm
static name:hello
normal age:18htm
从这个例子还能够看出,咱们能够在没有建立对象的状况下,经过类名直接调用static修饰的方法和变量,因此能够得知,static是不依赖于对象存在的,即对象
3.被类的全部对象所共享blog
所以,静态的成员变量和方法也不能使用this,super关键字,这2个关键字都是基于对象的。
4.能够直接被类名所调用
在上述的例子中,能够看到static修饰的变量方法是直接经过类名Test调用出来的,固然,在建立对象以后,一样可使用建立的对象去调用这个方法。
在不建立对象的状况下,静态方法不能访问类的非静态成员变量/方法,main方法就是一个静态方法,假如咱们在Demo类里建立一个成员变量String names,要在main方法里直接取到这个值是不行的,若是没有建立对象,它就不能直接访问。而非静态方法能够访问静态成员/方法
《Thinking in java4》中“当程序建立第一个对类的静态成员的引用时,就会加载这个类。这个证实构造器也是类的静态方法,即便在构造器以前没有使用static关键字”。由于静态方法能够在未建立对象时调用,从这个角度看,构造方法在对象未建立时调用,能够看做是静态方法。
但从另外一个方面来看,静态方法不能调用实例方法,而构造方法能够调用实例方法,因此构造方法也不算是静态方法。