以实际的例子去解释使用static 关键字的意义:
static (静态成员变量):
用来修饰成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。 意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。既然属于类,就可以不靠创建对象来调用了。
类变量:
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值。
定义格式:
static 数据类型 变量名;
举例:
static int grade;
静态方法:
当 static 修饰成员方法时,该方法称为静态方法 。静态方法在声明中有 static ,可直接使用类名来调用
定义格式:
修饰符 static 返回值类型 方法名 (参数列表){
//执行语句
}
举例:在Student类中定义静态方法
public static void showNum() {
System.out.println(“num:” + numberOfStudent);
}
静态方法调用的注意事项:
- 静态方法可以直接访问类变量和静态方法。
- 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。
- 静态方法中,不能使用this关键字。
下面开始举例说明:
如图所示,假如需要定义一个关于课表的学生类,里面有姓名,年龄,学号,上课教室,这里的共有信息:上课教室(用红色标注)。对于姓名,年龄,学号而言,每个对象都要用自己独立的数据,
但是对于上课教室而言,应该是多个对象共享同一份数据才对。因为同一班级的同学的是一个集体,上课的教室也是一个共有的属性,假如下一节课要换一所教室上课的话,如果不用static修饰成员变量,则需要全部对象都更改一遍,此处举例三人,但是一个班的同学的数据会更多,所需代码也就会越多,也会消耗更多内存。
代码如下:
public class Student {
private String name; //学生姓名
private int age; //学生年龄
private int studentid; //学生学号
public static String Classroom; //上课教室
}
static静态变量在内存中的原理图解:
总结:
对于此类情况的成员变量处理,一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份数据。简单来说就是大家都绑定在一起的变量定义,比如上课时间,上课地点等。则使用static 关键字去定义,如果是每个对象独有的,如学号,姓名等。则使用private 去定义。对于static修饰的方法也是同样的道理。