静态变量又叫做类变量,静态方法又被称为类方法——均被static修饰
未被static修饰的成员变量和方法分别被称为实例变量和实例方法
(1)静态方法中不需要它所属类的任何实例就可以访问,所以在静态方法中不可以使用this关键字
(2)静态方法中不可直接访问所属类的实例变量和实例方法,但可以直接访问所属类的静态变量和静态方法
如图所示,如果在静态方法中想要直接访问所属类的实例变量和实例方法或使用this关键字,编译器都会报错
(3)静态变量(方法)的访问方式:类名.变量名(方法名)
实例变量(方法)需要先将类实例化后才可访问:实例化名.变量名(方法名)
如图所示,未实例化时使用“类名.变量名(方法名)”就可以直接访问静态变量(方法),但无法访问相应类的实例变量和实例方法
如图所示,当将类实例化后,使用“实例化名.变量名(方法名)”就可以直接访问实例变量(方法),但无法访问相应类的静态变量和静态方法
(4)在内存中,实例/静态成员的存储形式大致如图
所有静态成员共享一份内存——静态变量某种意义上具有全局性质
而不同实例间的实例变量彼此互不干涉
以下是一个代码范例:
public class staticclass {
public static int count = 0; //静态变量
public int num =0; //非静态变量
public static void method1(){ //静态方法
System.out.println("正在访问静态方法(count++)....");
System.out.println("tpre-count = "+count);
count++;
//num++; //静态方法中不可以访问实例变量
//method2(); //静态方法中不可以访问实例方法
//System.out.println(this.num); //静态方法中不可以使用this关键字
System.out.println("tpst-count = "+count);
}
public void method2() //实例方法
{
System.out.println("正在访问实例方法(count+2,num+3)....");
System.out.println("tpre-count = "+count);
System.out.println("tpre-num = "+num);
count+=2;
num+=3;
System.out.println("tpst-count = "+count);
System.out.println("tpst-num = "+num);
}
public static void main(String[] args) {
System.out.println("初始时,count = "+staticclass.count); //访问静态变量:类名+变量名
staticclass.method1();//访问静态方法:类名+变量名
staticclass a = new staticclass();
System.out.println("na未操作前,count = "+staticclass.count);
System.out.println(" num = "+a.num);
a.method2();
staticclass b = new staticclass();
System.out.println("nb未操作前,count = "+staticclass.count);
System.out.println(" num = "+b.num);
b.method2();
}
}
运行结果如图,可印证以上三点:



