在java中有种静态修饰符static,static只能修饰变量和方法,不能修饰类。有static修饰的变量和方法是通常叫做静态变量和静态方法,而没有被修饰的变量和方法通常叫做非静态变量和非静态方法或实例变量和实例方法。我们常用的main方法就是静态的,在静态方法中是不可以使用实例变量和实例方法的,只能使用静态变量和方法,而在实例方法中即可以使用静态变量和静态方法,也可以使用实例变量和方法。
要在静态方法中使用实例变量和实例方法,就要创建一个新的对象去使用,而这个对象所对应的类要包含所要使用的实例变量和方法。
静态的变量和方法是这个类的方法,而实例变量和方法是实例的变量和方法,所以对静态的变量,方法的操作实际上是对这个类进行操作,而实例变量,方法不一样,实例的改变只会是这个实例变化,而类本身是不会改变的,例:
class Test2{
static int number;
String name;
public static void a()
{
System.out.println("a方法可以运行");
}
public void b()
{
}
}
public class STATIC
{
public static void main(String[] args)
{
Test2 t1 = new Test2();
Test2 t2 = new Test2();
Test2.a();
//程序将输出“a方法可以运行”
//Test2.b();是错误的
Test2.number = 2;
//Test2.name = "1";是错误的
System.out.println("Test2.number = " + Test2.number);
//程序输出的结果是“Test2.number = 2”
t1.name = "小";
t2.name = "大";
System.out.println("t1.name = " + t1.name);
//显示“t1.name = 小”
System.out.println("t2.name = " + t2.name);
//显示“t2.name = 大”
t1.number = 3;
t2.number = 4;
System.out.println("Test2.number = " + Test2.number);
//显示“Test2.number = 4”
System.out.println("t1.number = " + t1.number);
//显示“t1.number = 4”
System.out.println("t2.number = " + t2.number);
//显示“t2.number = 4”
}
}
在类Test2的对象中对实例变量name的改变是互不影响的,而对静态变量number的改变却是直接影响了类中变量的值。
从内存的角度出发,当类Test2一定义时,系统就为number在堆内存中分配了一个空间,而创建了一个Test2的对象,系统就为name 在堆内存中分配一个空间,所以所有的number都是公用一个空间的,所有的name都是使用不同的空间的。
另在static修饰的方法中是不能使用this的。