final变量
final变量有成员变量和局部变量,在类成员中final经常和static一起使用,作为类常量使用。其中类常量必须在声明是初始化,final成员常量可以在构造函数初始化。
public class test {
public static final int a;//报错
public static final int b=1;
}
由static和final修饰的常量必须在声明时,初始化。由于static静态的代码是比构造器执行。
而只有final修饰的成员常量,可以在构造函数中初始化。
也就是说final修饰的成员常量,必须在构造器执行之后,这个值被赋值。简单来说就是在声明时初始化或者在构造方法中初始化。
public class test {
public final int a;
public static final int b=1;
test(){
a=1;
}
}
final修饰的变量,只允许被赋值一次。例如引用只被赋值一次引用
但是不影响被引用对象的属性改变,只是我这个引用不能改变。
final修饰的方法,不能被子类重写
final修饰的类,不能被继承
final方法,在编译时已经静态绑定了,不需要运行时动态绑定。
final类
final类不能被继承,并且final类中的方法默认是final类型的
final的注意点
1.final成员变量必须声明在初始化或者构造器中初始化,否则编译出错
2.接口中声明的变量默认都是final
3.final方法在编译阶段绑定,称为静态绑定
4.final变量,在使用前必须赋值
final方法的好处
1.提高了性能,jvm在常量池中会缓存final变量
2.final变量在多线中并发安全,无需额外的同步开销
3.final方法时静态编译的额,提高了调用速度
final内存分配
当我们区调用一个函数时,有两部分时间:一部分是去寻找这个函数的位置的时间,另一部分是执行函数的时间。执行时间肯定是少不了的,这就得去看看如何节省寻找函数位置的时间,这就有了内嵌机制。
当我一个函数定义为final类型。我再调用这个函数的时候,编译器会把这个final函数给嵌入到调用的地方。这样就不需要去寻找这个函数了。
也就是在使用final修饰方法的时候,编译器会将被final修饰过的方法插入到调用者代码处。
本文属于自己参考文章和结合自己的总结来学习和巩固Java基础
参考文章:https://github.com/h2pl/Java-Tutorial/blob/master/docs/java/basic/1%E3%80%81%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E5%9F%BA%E7%A1%80.md