static 关键字
1.Static变量
一种被Static修饰的变量叫做静态变量 ;另一种是没被修饰过的叫做 实例变量
两者的区别是: 对于静态变量 在内存中只有一个拷贝, jvm只为静态分配一次内存 ,在加载类的过程中完成静态变量的内存分配,可用类名直接访问
对于实例变量,每创建一个实例变量就会为实例变量分配一次内存, 实例变量可以在内存中又多个拷贝 ,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
1:在对象之间共享值
2:方便访问变量时
2. 静态方法
用来修饰成员方法 将其变为类方法 , 可以直接使用“类名.方法名”的方式进行调用, 常用于工具类
如图: Test 类中
静态变量a; 静态方法A ,非静态方法B
在 staticTest 类 test方法中 可以直接引用静态方法 ,静态常量
不能引用非静态方法 静态方法必须先new 出来后 才能调用
静态方法可以直接通过类名调用 ,不依赖任何对象就可以进行访问 因此静态方法中不能使用this和super关键字
3.static 代码块 (可以优化程序性能)
static代码块也叫静态代码块, 是类中独立于类成员的static语句块, 可以有多个
位置可以随便放, 它不在任何的方法体内, jvm在加载类的时候会执行这些静态代码块,
如果static代码块有多个 ,jvm 将按照他们在类中的出现的先后顺序依次执行它们 ,每个代码块只会执行一次
- public class Test5 {
- private static int a;
- private int b;
- static {
- Test5.a = 3;
- System.out.println(a);
- Test5 t = new Test5();
- t.f();
- t.b = 1000;
- System.out.println(t.b);
- }
- static {
- Test5.a = 4;
- System.out.println(a);
- }
- public static void main(String[] args) {
- // TODO 自动生成方法存根
- }
- static {
- Test5.a = 5;
- System.out.println(a);
- }
- public void f() {
- System.out.println("hhahhahah");
- }
- }