static修饰的变量或方法称为类变量或类方法,表明所修饰的对象是静态的,可以被类的所有对象共享。。没有被static修饰的变量则是实例变量,即在引用之前,需要被实例化。static可以在任何对象被创建之前访问,无需任何对象引用。
1. 实例变量和类变量(静态变量)
静态变量仅在生成第一个对象时分配内存,所有实例对象共享同一个静态变量。静态变量可以通过类名直接访问,而无须先生成一个实例对象,也可以通过实例对象访问类变量。
实例变量:每个对象的实例变量都需要分配单独的内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。
2.实例方法和类方法(静态方法)
实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。
但是类方法不能访问实例变量,只能访问类变量。类方法可以有类名直接调用,也可以由实例对象进行调用。类方法中不能使用this 或super 关键字。
在创建对象sumcat的过程中,先在stack空间创建对象引用sumcat,然后在heap区new一个Test内存区,里面有cat和number2。然后把number1++的值赋给number2=3,然后number1+1=4。在summouse调用number1时,number1即为4。
如果number1不是static变量,则会在每个实例化对象分配的heap空间内都有不同的值,即在sumcat和summouse内,number1的值都为3。
例如
public class Test {
private String cat;
private static int number1 = 0;
int number2;
Test(String cat){
this.cat = cat;
number2 = number1++;
}
public void info(){
System.out.println("There are "+number2+" "+cat+".");
}
public static void main(String args[]){
Test.number1 = 3;
Test sumcat = new Test("cats");
Test summouse = new Test("mice");
sumcat.info();
summouse.info();
}
}
输出:
There are 3 cats.
There are 4 mice.