1 概要
static关键字用来修饰成员变量和成员方法,被修饰的成员属于类,而不仅仅属于某个对象。
2 类变量:被static修饰的成员变量
类的所有对象共享同一个类变量,可以通过类来操作该对象,该类的所有对象也可以操作该类变量。
格式:
修饰符 static 数据类型 变量名;
建议使用类名直接操作类变量。
案例(学号分配):新学期开学,学生去报到,需要为每个新来的学生分配学号(sid)。学号唯一、连续、与班级的人数相符,这样以便知道,要分配给下一名新同学的学号是多少。因此我们需要一个变量,与单独每个学生对象无关,而是与整个班级同学数量有关。
public class Student {
private String name;
private int age;
// 学生的id
private int sid;
// 类变量,记录学生数量,分配学号
public static int numberOfStudent = 0;
public Student(String name, int age){
this.name = name;
this.age = age;
// 通过numberOfStudent给学生分配学号
this.sid = ++numberOfStudent;
}
// 打印属性值
public void show(){
System.out.println("Student : name=" + name + ",age=" + age + ", sid=" + sid);
}
}
public class StuDemo {
public static void main(String[] args) {
Student s1 = new Student("张三",23);
Student.numberOfStudent = 38;
Student s2 = new Student("李四",24);
Student s3 = new Student("王五",25);
Student s4 = new Student("赵六",26);
s1.show();//Student : name=张三,age=23, sid=1
s2.show();//Student : name=李四,age=24, sid=2
s3.show();//Student : name=王五,age=25, sid=39
s4.show();//Student : name=赵六,age=26, sid=40
}
}
3 类方法:被static修饰的成员方法
类的所有对象共享同一个类方法,可以通过类来使用该方法,该类的所有对象也可以使用该类方法。
格式:
修饰符 static 返回值类型 方法名(参数列表){
//执行语句
}
建议通过类名直接使用类方法。
案例:接上例,在Student类中定义静态方法
// 打印学生数量
public static void showNum() {
System.out.println("num:" + numberOfStudent);
}
public class StuDemo {
public static void main(String[] args) {
Student s1 = new Student("张三",23);
Student s2 = new Student("李四",24);
Student.numberOfStudent = 38;
Student s39 = new Student("王五",25);
Student s40 = new Student("赵六",26);
Student.showNum();//num:40
s1.numberOfStudent = 50;
s1.showNum();//num:50
}
}
类方法注意事项:
- 类方法只能直接访问类变量和类方法,不能直接访问普通成员变量或普通成员方法;
- 普通成员方法可以直接访问类变量和类方法;
- 类方法中不能使用this关键字。
4 静态代码块:static {}
作用:给类变量进行初始化赋值
位置:类中方法外
格式:static { }
随着类的加载而执行且只执行一次,执行优先于main方法和构造方法。
public class Game {
public static int number;
public static ArrayList<String> list;
static {
number = 2;
list = new ArrayList<>();
list.add("张三");
list.add("李四");
}
}
5 总结
static关键字可以修饰变量、方法和代码块,主要目的还是希望在不创建对象的情况下去调用方法。