java的static关键字和C++还是有较大差别的。
static不可以修饰局部变量
和C++有出入。C++还有静态全局变量,java没有全局变量这中说法,因为所有语句包括定义语句都必须写在类或者接口或者方法内,而方法也必须写在类或者接口内。
修饰成员变量
package school;
public class School {
static String name;
public static void main(String[] arg) {
System.out.println(School.name);
}
}
静态方法或者静态属性,独立于对象,所以可以直接通过类名.的方式访问或者调用。事实上,在类内部,类名都可以省略(没有被局部变量覆盖的话)。
虽然static方法或者属性不属于对象,但也可以通过对象.的方式来访问。这和C++也是一致的。
修饰方法
1、静态方法没有this引用,即不可以使用this来访问对象成员,所以导致了规则2。
2、重点:静态方法不能访问非静态成员(包括属性和方法),main方法也不例外。但是非静态方法是可以访问静态方法或者静态属性的。
静态代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照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代码块中进行。
总结
- 修饰的属性所有对象都只有一个值,这一点和C++一致。
- static不可以修饰局部变量。
- static没有this和super引用
- static虽然没有this,但是对象里可以通过this来访问static方法或者属性,这和可以通过对象.的形式来访问本质是一样的。