一、static关键字
static为静态修饰符,表示某个元素是静态的、不依赖于对象的
static修饰位置 | 表示含义 |
---|---|
变量 | 表示这是一个类变量,类加载时分配在堆中 |
方法 | 静态方法,不依赖于对象可直接通过类标识访问 |
代码块 | 静态代码块,只在类加载初始化阶段时执行一次 |
内部类 | 静态嵌套类,表示只是放在外部类的文件里,其他的和普通类没区别 |
二、final关键字
final为不可变修饰符,通常我们希望某个元素是固定状态的不可修改的,就会用final关键字去修饰
final修饰位置 | 表示含义 | 例子 |
---|---|---|
类 | 表示这个类是不可被继承的 | String类 |
类变量 | 表示这个类变量在声明时就必须初始化 并且初始化完成后就不可变了 | Double.MAX_VALUE |
实例变量 | 表示这个实例变量必须在对象创建完成前被初始化, 并且初始化完成后就不可变了 | 类加载器的parent变量 |
局部变量 | 表示只可被赋值一次,赋值后就不可变了 | |
形参 | 表示传入的形参不可变 | |
实例方法 | 表示这是一个非虚方法,子类不可重写 | ClassLoader的defineClass()方法 |
final的好处
1、final 关键字,提高了性能,JVM会缓存 final 变量。
2、final 变量,可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
总结
1、final 关键字可以用于修饰类、类变量、实例变量、局部变量、形参以及方法。
2、final 成员变量,必须在声明的时初始化或者在构造器中初始化,否则报编译错误。
3、final 变量不能再次赋值(引用类型指向的对象中的数据还是可以修改的);final 方法不能被重写;final 类不能被继承。
4、在匿名类中声明的变量都必须是 final 变量。
5、接口中声明的所有变量本身是 final 的。
6、修饰类时final 和 abstract 这两个关键字是反相关的,final 类就不可能是 abstract 的。
参考文章:java final 详解