4.static关键字
在Java中不存在全局变量的概念,通过static实现了一个伪全局的概念。可以用来修饰成员变量、成员方法和代码块。
Java内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用。堆内存主要存放一些对象。
在JVM加载一个类的时候,如果该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域。
被static修饰的成员变量和成员方法独立于该类,它不依赖于某个特定的实例变量,也就是说它被该类的所有实例共享。所有实例的引用都指向同一地方,任何一个实例对其的修改都会导致其它实例的变化。
public class StaticTest {
private static int count = 0;
//每次new对象count+1
public StaticTest(){
count++;
}
public static void main(String[] args) {
StaticTest s1 = new StaticTest();
StaticTest s2 = new StaticTest();
StaticTest s3 = new StaticTest();
System.out.println(StaticTest.count);//3
}
}s
static变量
static修饰的变量称之为静态变量,没有用static修饰的变量称之为实例变量
区别:静态变量是随着类加载时完成初始化的,它在内存中仅有一个。
实例变量是伴随实例的,每创建一个实例就会产生一个实例变量,他与该实例同生共死。
使用场景:基于以上,一般在2种情况下使用静态变量:对象之间共享数据,访问方便
static方法
静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的。因为没有
依附任何对象,在静态方法中不能访问类的非静态成员变量和非静态成员方法。
由于静态方法可以在未创建对象时调用,从这个角度看,构造方法在对象未创建时调用,可以看 作是静态方法;
从另一方面,静态方法内不能调用实例方法,而构造器可以调用实例方法,所以构造方法也不算 是静态方法。
static代码块
static可以用来形成静态代码块优化程序性能。static块可以置于类中任何地方,类中可以有多个 static块。在类初次被加载的时候,会按照static快的顺序来执行每个static块,并且只会执行一 次。
因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中。
final和static
static final可理解为”全局常量“
有关构造方法,静态方法执行顺序总结:
1.首先执行父类静态代码块的内容;
2.执行子类的静态代码块内容;
3.执行父类非静态代码块;
4.执行父类的构造方法;
5.执行子类的非静态代码块;
6.执行子类的构造方法。
浙公网安备 33010602011771号