java关键字static完全总结

来源:互联网 发布:舍恩伯格大数据时代 编辑:程序博客网 时间:2024/06/07 02:41

1.static修饰属性

  1. static修饰属性表示该属性是静态属性(静态变量),类属性(类变量)。
  2. 静态属性由该类的所有实例所共享,属于类本身,可用类名.属性名直接访问
  3. 静态属性先于类的实例而存在。静态属性在类的初始化过程中就被创建了,且被保存在了全局数据区的静态区。
  4. 静态属性的继承问题:在包可见性允许的情况下,子类可以继承父类的静态属性。

注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程只进行一次。也就是类变量只会被创建一次。

2.static修饰方法

  1. static修饰的方法称为静态方法。由所有的类实例所共享,属于类本身,可用类名.方法
  2. 静态方法的继承问题:在包可见性允许的情况下,子类可以继承父类的静态方法

注意:关于静态方法和实例方法的误区。 
静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。 
事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

3.static修饰代码块{…}

  1. static{}(即static块),会在类被加载的时候执行且仅会被执行一次(因为在虚拟机的生命周期中一个类也只会加载一次)。
  2. static块的执行顺序

    1. 当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;

      public class TestStatic{    static{        System.out.println(1);    }    static{        System.out.println(2);    }    static{        System.out.println(3);    }    public static void main(String args[]){        System.out.println(5);    }    static{        System.out.println(4);    }}

      结果:程序会输出1,2,3,4,5

    2. 如果静态变量在定义的时候就赋给了初值(如static int x=100),那么赋值操作也是在类加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;

      class Test{    public static int X = 300;    static    {        System.out.println(X);        X = 200;        System.out.println(X);    }}public class StaticBlockTest{    public static void main(String args[])    {        System.out.println(Test.X);    }}

      结果:程序会依次输出300,200,200,先执行完X=300,再执行static{}语句块。

4.static修饰类(静态内部类)

静态内部类没有外部对象的引用,所以它无法获得外部对象的资源,当然好处是,静态内部类无需依赖于外部类,它可以独立于外部对象而存在。创建静态内部类的代码如下: 
Outer.Inner inner = new Outer.Inner(); 
这里就不详细讲内部类的知识了

注:
类加载:虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。

类加载特性 :

  • 在虚拟机的生命周期中一个类只被加载一次。
  • 类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。
  • 类加载的时机: 
    1. 第一次创建对象要加载类。
    2. 调用静态方法时要加载类,访问静态属性时会加载类。
    3. 加载子类时必定会先加载父类。
    4. 创建对象引用不加载类。
    5. 子类调用父类的静态方法时 
      1. 当子类没有覆盖父类的静态方法时,只加载父类,不加载子类。
      2. 当子类有覆盖父类的静态方法时,既加载父类,又加载子类。
    6. 访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。
0 0
原创粉丝点击