static关键字
在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,JVM则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,就可以通过类名去进行访问。
public class A {
public static void main(String[] args) {
B.print();
}
}
class B{
public static void print(){
System.out.println("Hello");
}
}
输出:
Hello
同时被static修饰的成员变量和成员方法是独立于该类的,它不依赖于某个特定的实例变量,也就是说它被该类的所有实例共享。所有实例的引用都指向同一个地方,任何一个实例对其的修改都会导致其他实例的变化。
public class A {
public static void main(String[] args) {
B b1 = new B();
B b2 = new B();
b1.add();
b2.add();
System.out.println("b1中的值为:"+B.a);
System.out.println("b2中的值为:"+B.a);
}
}
class B{
static int a = 0;
public void add(){
a++;
}
}
static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能
从上面代码里看出:
静态方法ave()中调用非静态成员变量b,编译失败。这是因为,在编译期并没有对象生成,b变量根本就不存在。
静态方法ave()中调用非静态方法add(),编译失败。从逻辑上来说,静态方法已经在编译的时候生成了,但是非静态方法需要对象才能生成,在静态方法里面没有创建B的对象,肯定不能调用它的非静态方法。所以也不允许在静态方法中调用非静态方法。
但是非静态成员方法add()访问静态成员方法ave(),静态变量a是没有限制的
所以,如果想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。最常见的静态方法就是main方法,这就是为什么main方法是静态方法就一目了然了,因为程序在执行main方法的时候没有创建任何对象,只有通过类名来访问。