目录
- 1、static
- 2、static 修饰成员变量
- 2.1、静态成员变量初始化
- 2.1.1、就地初始化
- 2.1.2、静态代码块初始化
- 3、static 修饰成员方法
- 4、静态成员 VS 实例成员
1、static
Student 类中有 name、gender、age 和 score 字段,用来描述不同学生,那么是否可以在 Student 类中加入 classRoom 字段,答案是不能。
因为在类中定义的实例变量,每个对象都会包含一份,用于描述具体的对象,但是 classRoom 这个属性每个学生保存一份是不合理的, classRoom 也不能描述具体的学生,而是需要所有学生都共享。此时需要用到 static 修饰。如下述代码所示。
public class Student {private String name;private String gender;private int age;private double score;private static String classRoom;
}
在 Java 中,被 static 修饰的成员称为静态成员,也可以称为类成员,其不属于某个具体的对象,而是所有对象所共享的。注意 static 修饰成员变量、成员方法、类。
2、static 修饰成员变量
static 修饰的成员变量成为静态成员变量,静态成员变量的特性如下:
- 静态成员变量不属于某个具体的对象,而是类的属性,是所有对象共享的。
- 静态成员变量存储在方法区中,并不存储在某个对象的空间中。
- 静态成员变量是类的属性,因此只会在 JVM 加载类时才开辟空间并进行初始化。
- 静态成员变量生命周期伴随类的一生,随着类的加载而创建,随着类的卸载而销毁。
- 静态成员变量可以通过对象访问,也可以通过类名访问,更推荐使用类名访问。
Student s1 = new Student();// 通过对象.静态成员名访问 不推荐System.out.println(s1.classRoom);// 通过类名.静态成员名访问 更推荐System.out.println(Student.classRoom);
2.1、静态成员变量初始化
静态成员变量一般不会放在构造方法中初始化,构造方法中初始化的是与对象有关的实例属性。
静态成员变量的初始化分为两种:就地初始化和静态代码块初始化。
2.1.1、就地初始化
就地初始化指的是在定义时直接给出初始值。
// 就地初始化
private static String classRoom = "room304";
2.1.2、静态代码块初始化
使用 static 定义的代码块成为静态代码块,一般用于初始化静态成员变量。
// 静态代码块
static {classRoom = "room306";
}
- 无论创建多少个对象,静态代码块只执行一次。
- 如果一个类中有多个静态代码块,则在编译代码时,按照定义的先后次序依次执行。
3、static 修饰成员方法
一般来说,类中的数据成员设置为 private,而类中的方法设置为 public,那么当静态成员变量设置为 private 时,其他类如何访问该静态成员变量呢,答案是使用静态成员方法。
被 static 修饰的方法称为静态成员方法,是类的方法,不是某个对象特有的,静态成员变量一般是通过静态方法访问的。
public static String getClassRoom(){return classRoom;
}
- 静态方法不属于某个具体的对象,是类方法。
- 静态方法不能在静态方法中访问任何非静态成员变量,也不能调用任何非静态方法,这是因为静态方法在调用时无法传递 this 引用。
- 静态方法无法被重写。
- 静态成员变量可以通过对象访问,也可以通过类名访问,更推荐使用类名访问。
Student s1 = new Student();// 通过对象.静态成员名访问 不推荐System.out.println(s1.getClassRoom());// 通过类名.静态成员名访问 更推荐System.out.println(Student.getClassRoom());
4、静态成员 VS 实例成员