final

  1. final关键声明的属性为常量。
    特征:
  • final修饰的属性(实例变量)在声明时就应该赋初值
  • final修饰基本类型变量不能再被修改,引用类型的引用变量不能修改例如:final A a = new A();那么final A a = new B();就是不合法的了。但是呢a.c = 1;是合法的,只是引用的对象new A()不能变其他对象,被引用的对象本身还是可以被修改的。
  1. final修饰的方法
    public class A {
     public final void method(){
         System.out.println("我不能被重写了");
     }
    }
    class B extends A{
     @Override
     public final void  method() { 
    // method() cannot override method() in 'com.meng.javase.A';overridden method is final
     }
    }
  2. final修饰的类
    public final class A {
    }
    class B extends A{  //Cannot inherit from final 'com.meng.javase.A'(不能继承final修饰的类)                   
    }

    static

  3. static修饰的属性、方法、代码块初始化顺序
    静态变量和静态语句块优先于实例例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们
    在代码中的顺序。
    public static String staticField = "静态变量";
    static {
    System.out.println("静态语句块");
    }
    public String field = "实例例变量";
    {
    System.out.println("普通语句块");
    }
    最后才是构造函数的初始化。
    public InitialOrderTest() {
    System.out.println("构造函数");
    }

---存在继承的情况下,初始化顺序为:
---父类(静态变量、静态语句块)
---子类(静态变量、静态语句块)
---父类(实例例变量、普通语句块)
---父类(构造函数)
---子类(实例例变量、普通语句块)
---子类(构造函数)