static 表示 全局、静态 的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说它不依赖类的特定实例,被类的所有实例共享。
只要这个类被加载,Jvm就能根据类名在运行时数据区的方法区内找到他们,因此static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量副本,而是类的所有实例共享一个static变量。
static变量可以用private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用,但是不能再其他类中通过类名来直接饮用
static修饰的成员方法和成员变量可以通过类名直接访问.
用static修饰的代码块表示静态代码块,JVM加载类时,就会执行该代码块。
static变量和实例变量
静态变量在内存中只有一个copy,JVM只为静态分配一次内存
实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个copy,互不影响。
static 变量使用场景:
- 对象之间共享值
- 方便访问变量时
静态方法
可以通过类名直接调用
所以静态方法中不能使用this和super关键字,只能访问类中的静态成员变量和成员方法,因为satatic方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
static代码块
在类中独立于类成员的static 语句块,位置随意,不在任何方法体内,JVM加载类时会执行这些静态代码块,每个代码块只会被执行一次。
static方法限制
- 只能调用其他static方法
- 只能访问static数据
- 不能使用this或super关键字