定义
- static:静态的
- 是一个修饰符,用于修饰类的成员变量、类的成员方法,另外可以编写static代码块来优化程序性能。
- 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
一、修饰变量
- 我们通常把static修饰的变量成为静态变量或类成员。
- 静态变量独立于该类的对象,只要该类被加载可以通过【类名.静态变量名】 来调用
- 类的所有实例共享一个static变量,在内存中只有一个副本,即一个实例对静态变量进行更改后,其他的实例调用此变量时,使用的是更改过后的静态变量。
- 静态变量当且仅当在类初次加载时被初始化;而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象所拥有的副本互不影响。
- 静态变量的初始化顺序按照定义的顺序
二、修饰方法
- static修饰的方法一般称作静态方法
- static修饰成员方法最大的作用,就是可以使用【类名.方法名】的方式操作方法,避免了先要new出对象的繁琐和资源消耗。
- 静态方法是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。
- 虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
三、 修饰代码块
- static关键字修饰的代码块称为静态代码块,不在任何方法体内,可以用来优化程序性能。
- static块可以置于类中的任何地方,类中可以有多个static块。
- 当JVM加载类时,就会执行静态代码块,无需等待实例化,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
static优化性能例子:
class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
isBornBoomer是用来判断一个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成下面这样效率会更高:
class Person {
private Date birthDate;
private static Date startDate, endDate;
static {
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
}
}
因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
一个static修饰的类中,不能使用非static修饰的成员变量和方法,这很好理解,因为static修饰的方法是属于类的,如果去直接使用对象的成员变量,它会不知所措(不知该使用哪一个对象的属性)。