final修饰符
在非访问权限控制符中有一个final修饰符,它可以修饰变量、方法和类
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。
final变量:
当final修饰变量的时候这个变量就会变成常量,能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。
常量通常使用大写字母来加以区分
final修饰符通常和static修饰符一起使用来创建类常量。
-
final变量声明与初始化
final变量赋值的方式:直接赋值、构造函数、初始化块中
由于在java的语法中,声明和初始化是联系在一起的,
也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)
对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化。
如果是静态的,则可以在初始化块。
-
内存
常量(final变量)和非final变量的处理方式是不一样的。
每一个类型在用到一个常量时,都会复制一份到自己的常量池中。
常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。
(可能是,类变量被所有实例共享,而常量池是每个实例独有的。)
-
final变量为什么不会变
有人说final变量在赋值后就不可变,
那么这个不变到底指的是什么呢?
这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。
就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。
-
final变量的效率
在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样。
-
变量初始化顺序
变量的初始化次序优于任何方法,甚至在构造方法的前面。对于static变量也是一样,
如果变量是原始类型,那么它得到一个标准的原始类型的初始值,
如果是一个对象的引用,除非你创建了一个新的对象给这个引用,否则就是null。
static变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static之后就不再进行初始化了,
static变量在类初始化时(注意不是实例),就必须分配内存空间,
static变量单独划分一块存储空间。
java类首次装入时,会对静态成员变量或方法进行一次初始化,
先初始化父类的静态代码–>初始化子类的静态代码–>
(创建实例,如果不创建实例,则后面的不执行)初始化父类的非静态代码–>初始化父类的构造–>初始化子类的非静态代码–>初始化子类的构造类只有在使用new调用创建的时候才会被java类装载器装入。
作者:奋斗码农
来源:CSDN
原文:https://blog.csdn.net/xufei512/article/details/50773710
版权声明:本文为博主原创文章,转载请附上博文链接!
final方法
类中的Final方法可以被子类继承,但是不能被子类修改。
声明final方法的主要目的是防止该方法的内容被修改。
-
final方法运行的过程
final方法会在编译的过程中利用内嵌机制进行inline优化。因为已经确定了这个方法不会被该bain,所以在编译的时候就将final方法的代码直接在调用发发的位置进行替换,而普通方法则需要在运行的时候根据引用的指向来判断需要调用哪个方法。
final类
final类不能被继承,没有类能够继承final类的任何特性。
参考资料:
奋斗码农 java中的final变量