一:实例变量和类变量
类体中的成员变量可细分为实例变量和类变量。用关键字static修饰的称作类变量,否则称为实例变量。例如:
class Dog{
float x; //实例变量
static int y; //类变量
}
实例变量与类变量的区别: ①不同对象的实例变量互不相同,也就是说分配给不同对象的实例变量占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。②所有对象共享类变量,即分配给这些对象的这个类变量占有相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量。③类变量是属于该类的,在类被加载到内存时就为类变量分配了相应的内存空间,故,可通过类名直接访问类变量。
class Factory {
int value = 0;
int limit = 0;
static int step = 2; //step为类变量
void increat(){
value++;
if(value == limit){
value = 0;
}
}
int getValue(){
int i;
return value;
}
}
public class Lei {
public static void main(String[] args) {
//声明两个对象d1,d2
Factory d1 = new Factory();
Factory d2 = new Factory();
System.out.println(d1.getValue());//输出结果为0
System.out.println(d2.getValue());//输出结果为0
System.out.println(d1.step);//输出结果为2
System.out.println(d2.step);//输出结果为2
d1.increat();//对d1进行了++
d1.step = 3;//对d1的step进行了赋值
System.out.println(d1.getValue());//d1的值变成了1
System.out.println(d2.getValue());//d2的值没有变,依然为0
System.out.println(d1.step);//d1.step的值变成了3
System.out.println(d2.step);//d2.step的值也变成了3!
//这也就说明了,一个对象里的类变量改变,其他对象里的对应的类变量也会改变
//对于类变量,可以直接用类名来访问而不用创建对象
Factory.step = 5;
System.out.println(Factory.step);
}
}
二:实例方法和类方法
方法类型前不加关键字static修饰的为实例方法,加static关键字修饰的是类方法。
区别:①要用对象调用实例方法。②可以用对象调用类方法,也可以用类名调用类方法,也就是说不必创建对象就可以直接调用类方法(创建对象会导致类中的实例变量被分配内存空间)。