将变量,常量或是方法设置为静态的目的在于实现不同类在同一内存区域共享一个数据。假设我们定义了一个球类和一个圆类,在这两个类中都需要使用PI这个常量,如果分别在两个类中各定义一个PI常量,那系统会将这两个不在同一个类中定义的常量分配到不同的内存空间中,有没有方法让两个类共用一个PI常量进而节省内存空间呢?为解决这个问题,就可以将这个常量设置成为静态的。
static关键字
由static修饰的变量,常量和方法被称为静态变量,常量和方法。
public class StaticTest1{
static int i = 10;
public void method(){
System.out.println("调用method方法");
for(i=0;i<3;i++){
System.out.print(i+"");
if(i==2)
System.out.print("\n");
}
}
public static void main(String[] args){
StaticTest1 S1 = new StaticTest(); //创建一个对象
StaticTest1 S2 = new StaticTest(); //创建另一个对象
S1.i = 60; //修改静态变量i的值
System.out.println("第一个实例对象调用变量i的结果:"+S1.i);
System.out.println("第二个实例对象调用变量i的结果:"+S2.i);
S2.method();
System.out.println("第一个实例对象调用变量i的结果:"+S1.i);
System.out.println("第二个实例对象调用变量i的结果:"+S2.i);
}
}
结果如下:
第一个实例对象调用变量i的结果:60
第二个实例对象调用变量i的结果:60
0 1 2
第一个实例对象调用变量i的结果:3
第二个实例对象调用变量i的结果:3
可见无论是通过S1改变 i 的值还是通过S2改变 i 的值,两个对象中变量 i 的值都同时发生了变化,这正是静态成员变量的效果,即对象S1和对象S2中的变量 i 都指向了同一块内存区域。
public class StaticTest2{
static double PI = 3.1415; //在类中定义静态常量
static int id; //在类中定义静态变量
public static void method(){ //在类中定义静态方法
//doSomething
}
public void method2(){
id = 1;
System.out.println(StaticTest2.PI); //调用静态常量
System.out.println(StaticTest2.id); //调用静态变量
StaticTest2.method(); //调用静态方法
}
public static void main(String[] args){
method();
method2();
}
}
结果如下:
3.1415
1
可以看到,在main(String[] args)方法中并没有先new一个StaticTest类对象再进行方法调用,而是直接调用了method()方法和method2()方法。这是因为主方法是静态的,如果要直接在主方法中调用其他方法,则该方法必须也是静态的。
关于静态方法,Java语言有两点规定:
1.在静态方法中不可以使用this关键字
2.在静态方法中不能直接调用非静态方法
同时Java规定不能将方法体内的局部变量声明为static的:
public class example{
public void wrongMethod(){
static int i = 0; // 错误,不可将方法体内的局部变量声明为static
}
}