JavaCore

final/static
  • final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。
  • final 修饰成员变量时,要不初始化,要不构造方法初始化。初始化后不可修改,多线程安全,比如传参数时使用final修改,方法内不可修改该变量。效率高,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
  • static 全局或者静态,或静态代码块,独立于该类的任何对象,不依赖特定实例。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
  • static 静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配
  • 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!
  • JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
  • static不可以修饰局部变量。
  • static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
  • static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。