Static关键字概述
static(静态)关键字可以用于修饰变量、方法和代码块。我认为static关键字的主要用途是:方便程序在不创建对象的情况下调用相应的变量或者方法。被static修饰的变量或者方法可以简单地通过应用类名来进行调用,无需创建相应的对象。
注意,Java语法规定,static不允许修饰局部变量
1、static变量
static变量即静态变量,被所有对象所共享,在内存中只有一个副本,当且仅当类被加载时初始化一次。
举个例子:
class StaticTest{
static int i = 47;
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
System.out.println(st1.i + " " + st2.i)
StaticTest.i++; // 不用新建对象,直接调用static变量
System.out.println(st1.i + " " + st2.i)
在这里,StaticTest内存在一个静态变量i,在StaticTest类被加载时,i会初始化为47。新建两个StaticTest变量st1和st2,输出st1和st2的i的值,都为47。经过StaticTest.i++后,再输出st1和st2的i的值,都变成了48。即静态变量被这两个对象共享,且只有一个副本。
如果一个类既有static变量,又有非static变量。那么在初始化时,先进行static变量的初始化,再进行普通变量的初始化,最后执行该类的构造函数。具体例子请查看“初始化和清除”一章。
2、static方法
static方法意味着“一个特定的方法没有this,我们不可以从一个static方法内部发出对非static方法的调用”,因为非static的变量和方法都需要通过实际具体的对象进行调用,而static方法没有this,不依附于任何对象。
即:非static的方法可以调用static的方法,但是static方法不能调用非static的方法。
因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。
最常见的static方法即为main方法(public static void main)。由于程序在执行main方法之前没有任何对象,只能通过类名来调用,因此main方法必须是static的。
3、static代码块
static方法块只会在类初次被加载时,按顺序执行一次。巧妙利用static方法块,可以在一定程度上减少内存的使用,优化程序性能。
我们来看一个例子:
public class StaticTest {
static Date a;
static Date b;
static{
a = new Date(2008);
b = new Date(2017);
}
boolean compare1(Date birthDate){
if(birthDate.compareTo(a) >= 0 && birthDate.compareTo(b) < 0)
return true;
return false;
}
boolean compare2(Date birthDate){
Date low = new Date(2008);
Date high = new Date(2010);
if(birthDate.compareTo(a) >= 0 && birthDate.compareTo(b) < 0)
return true;
return false;
}
}
我们希望实现输入出生年月日,判断是否在2008--2017年内出生。
按照compare2方法,每次输入一个人的出生年月,都需要新建两个Date对象,分别代表下界2008和上界2017,然后再进行比较。
如果我们先在StaticTest类中定义两个static对象,同时通过static代码块在类初次被加载时对他们进行初始化为下界和上界。这样在输入数据进行比较compare1时,就不需要每次都新创建两个Date对象,优化了程序的性能。
因此,我们可以将一些只需要初始化一次的初始化操作都放在static代码块中进行。
具体的一些代码和面试题,可以参考:Java中的static关键字解析
网友评论