可拜读 https://www.jianshu.com/p/f68d6ef2dcf0
final 可以用来修饰类 方法 和 变量(变量包括类变量,实例变量,局部变量,方法的参数)
修饰类时
当final修饰类时,表示该类不可被继承。 java中String类就是final类。 final类的方法也将成为final方法。
什么时候用final修饰类呢? 该类完美实现了所有功能,不需要任何扩展(不太可能)
修饰方法时
方法被final修饰后,子类不能对其进行重写
什么时候用final修饰类呢? 为了提高性能(实现内联来实现性能,未必能够提高性能)
修饰变量时
final修饰的变量,可以在定义时出示话,使用初始化块初始化,也可以在构造函数中初始化
修饰基本类型的变量
- 程序编译期间的常量,它永远不会变。
- 在运行期间为一个final修饰的域初始化一个值,不希望它会发生变化(构造器初始化,属于这种)。
package others;
public class finalkeyword {
//定义时初始化
static final int NUM1 = 1;
//使用初始化块初始化
static final int NUM2;
static {
NUM2 = 10;
}
//定义时初始化
final int NUM3 = 1;
//使用初始化块初始化
final int NUM4;
{
NUM4 = 10;
}
//构造器中初始化,只适用于实例变量
final int NUM5;
public finalkeyword(){
NUM5 = 1;
}
}
修饰引用类型的变量
与基本类型不同,final修饰的引用类型,不可改变的只是变量中的对象的句柄,也就是说不能执行其他对象,但是对象中的数据还是可以修改的。
这里final涉及到一个闭包实现的问题。 闭包的实现方式可以参考这里
interface ILog{
void Write(String msg);
}
public class DemoClass4 {
public ILog logger(int level) {//要么把level设置final的,要么声明个final loglevel
//final
final int logLevel = level+1;
return new ILog() {
@Override
public void Write(String message) {
System.out.println("DemoClass4.AnonymousClass:InfoLog " + logLevel);
System.out.println(message);
}
};
}
public static void main(String[] args){
DemoClass4 demoClass4 = new DemoClass4();
demoClass4.logger(1).Write("abcefghi");
ILog log1 = demoClass4.logger(1);
ILog log2 = demoClass4.logger(2);
log1.Write("abc");
log2.Write("def");
}
}