java static作用盘点

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方法也不例外。但是非静态方法是可以访问静态方法或者静态属性的。
java static作用盘点

静态代码块

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方法或者属性,这和可以通过对象.的形式来访问本质是一样的。
上一篇:Redis中flushDB和flushAll的区别


下一篇:java中间带T时间设置