static
如果希望有些属性不应为对象的不同而改变,就将它设置为static,方法也同样可以
被修饰的成员具备以下特点
随着类的加载而加载//类加载之后,静态方法或属性就能用了
优先于对象存在//不用new
修饰的成员被所有对象所共享
访问权限允许时可不创建对象,直接被调用
因为不需要实例就可以访问static方法,所以static方法内部不能有this和super
class 梯形{
float 上底, 高;
static float 下底;
梯形(float x, float y, float h){//构造器
上底 = x;
下底 = y;
高 = h;
}
float 获取下底(){
return 下底;
}
void 修改下底(float b ) {
下底 = b;
}
}
public class CommonLader {
public static void main(String[] args) {
梯形 l1 = new 梯形(3.0f, 10.0f, 20);
梯形 l2 = new 梯形(2.0f, 3.0f, 10);
System.out.println("l1的下底" + l1.获取下底());
System.out.println("l2的下底" + l2.获取下底());
l2.修改下底(60);
System.out.println("l1的下底" + l1.获取下底());
System.out.println("l2的下底" + l2.获取下底());
}
}
输出:
l1的下底10.0
l2的下底3.0
l1的下底10.0
l2的下底60.0
使用static修饰的成员变量是类变量,属于该类本身;
没有使用static修饰的成员变量是实例变量,属于该类的实例。
由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间;但对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间。也就是说,程序中有几个实例,实例变量就需要几块内存空间。
class Person {
static int eyeNum;
int age;
}
Person.eyeNum = 2; //类变量属于类
当程序创建Person对象时,系统不再为eyeNum类变量分配内存空间,执行初始化,而只为Person对象
的实例变量执行初始化,因为实例变量才属于Person实例,而类变量属于Person类本身。