在了解静态变量之前,需要知道什么是实例字段。
在class类中定义的字段,就被称为实例字段。其特点是:每个实例都有独特的字段,实例之间的同名字段互不影响。
给实例字段进行static修饰,实例字段将变为静态字段。
public class Student() {
public String name; //实例字段
//注意,实例字段默认是private的,如果需要public,需要自行定义
public int age; //实例字段
public static int number; //静态字段
}
实例字段和静态字段有什么特点呢?
实例字段在每个不同的实例中将会开辟一个自己新的内存空间,而不同实例中的静态字段都指向同一个内存空间。显而易见,可以将一些公用的变量写为静态字段,以防止重复加载,重复开辟内存空间,造成不必要的浪费。
看下面的例子(来自:静态字段和静态方法 - 廖雪峰的官方网站):
public class main {
public static void main(String[] args) {
Person ming = new Person("Xiao Ming", 12);
Person hong = new Person("Xiao Hong", 15);
ming.number = 88;
System.out.println(hong.number);
hong.number = 99;
System.out.println(ming.number);
}
}
class Person {
public String name;
public int age;
public static int number;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在上面的例子中,我们在main类中调用Person内中的静态字段时,每创建一个number都需要去创建一个对象,然后使用 变量名.字段名 去使用,事实上不需要这样去做,也本不应该这样做,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为 类名.静态字段名
来访问静态对象。我们不需要创建一个新的对象,可以直接对静态字段通过 类名.静态字段名 进行调用,如下:
public class main {
public static void main(String[] args) {
Person.number = 88;
System.out.println(hong.number);
Person.number = 99;
System.out.println(ming.number);
}
}
class Person {
public String name;
public int age;
public static int number;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
所有实例中的静态变量都仅指向一个地址,每个静态变量在全局中都只是一个单例。每次对实例中调用的静态变量的修改,那么所有实例中调用的该变量都会被修改。
那么他与final常量又有什么区别呢?(参考文章:static与final的区别_static final-CSDN博客)
1. 常量需要在定义的时候赋值,而静态变量则不需要。
2. final修饰的变量为常量,一旦赋值就不能修改。
final修饰的方法为最终方法,不能重写。
final修饰的类是最终类,不能被继承。