final

修饰类
  • 修饰的类不可以被继承
  • 常见的final修饰的类:
    • 字符串类:String StringBuilder StringBuffer
    • 包装类:Byte Interger Double Short Long Float Character Boolean Void
    • 数学工具类:Math StrictMath
    • 系统类:System
  • 作用:final 修饰类的作用是为了保护封装,使其不可被继承,就不会有多态改变行为的可能。
    修饰方法
  • 修饰的方法不可以被子类继承重写。
    修饰变量
  • 修饰基本数据类型,则初始化后该变量的值不可以被修改。
  • 修饰引用数据类型,则初始化后该引用不可变,但引用指向的对象内容可以改变。
  • 修饰形参:参数在函数内部不可被修改,用于保证数据安全性,避免无意中改动数据带来的问题。

    static

    修饰代码块:
  • 一般用于类的初始化,静态代码块在类的构造函数执行前执行
  • 加载顺序:
    ==父类静态代码块—>子类静态代码块—>父类非静态代码块—>父类构造方法—>子类非静态代码块—>子类构造方法==
    修饰方法
  • static修饰的方法叫做静态方法或者类方法。
  • static修饰的方法属于整个类,在类加载的时候就存在且可以被调用,通过类名.方法名()即可调用。
  • 静态方法中不能访问类的非静态成员变量和非静态成员方法!
  • 静态方法中不能有this与super关键字!
  • 被static修饰的函数不可以用abstract修饰,必须实现。
    静态方法只能隐藏(hidden),不能重写(override)
  • 静态方法只能继承,不能重写。子类中可以定义与父类相同的静态方法,此时只是将父类中的方法隐藏,而不是覆盖它。
  • ==隐藏==:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
    修饰变量
  • static修饰的变量叫做静态变量或者类变量。
  • 静态变量被所有该类的对象共享,静态变量随着类加载的时候直接分配内存,与实例对象无关。可以用类名直接访问,也可以通过对象访问(不推荐这种方式)。
  • 由于共用内存区域的问题,所以在并发场景下直接使用静态变量会有安全问题,正确打开方式是:对修改静态变量的函数加锁。
  • static不能修饰局部变量。

    修饰常量

    1
    2
    3
    4
    //使用static final关键字修饰常量
    static final int a = 100;
    static int b = 100;
    final int c = 100;
  • 变量b没有final修饰,故可以被重新赋值,虽然c无法被重新赋值,但程序用完它且不会再用到它的时候就会被自动释放,不再占用内存。
  • a使用static final,故存放在静态空间,不会在程序运行时被释放,它永远占着内存直到程序终止,并且不能被修改,表示常量。