深入java final关键字 用法注意点和JVM对其进行的优化(例子)
来源:互联网 发布:淘宝淘金币怎么开通 编辑:程序博客网 时间:2024/04/30 06:21
上一篇文章我们总结了final关键字的基本用法和优点,这一篇文章我们继续深入,总结开发中遇到的使用final关键字需要注意的地方和JVM对final关键字的优化。我们用例子说明,原创不易,转载请注明出处:http://blog.csdn.net/yabay2208
(按照Java代码惯例,final变量就是常量,而且通常常量名要大写:)
- final关键字声明的static变量(属于类)必须在声明、类初始化(static{})的时候初始化,而且不能重复赋值;而非static变量(属于对象),必须在声明、对象初始化({}方法)或者构造函数里面初始化,也不可以重复赋值。(有例子)
- final static作为常量的时候,jvm会对其进行优化(有例子)
- final变量不可变的是句柄的地址,其实里面的值可以改变(有例子)
一:final变量的声明和初始化
final关键字声明的static变量(属于类)必须在声明、类初始化(static{})的时候初始化,我们举一个例子说明:
/** * @author yangwuyi */class Final{ static final String I = "helloworld"; static { System.out.println("Final's static function!类初始化。。。。。。"); //I = "helloWorld"; }}
或者:
/** * @author yangwuyi */class Final{ static final String I ; static { System.out.println("Final's static function!类初始化。。。。。。"); I = "helloWorld"; }}
但是对于而非static的final变量(属于对象),必须在声明、对象初始化({}方法)或者构造函数里面初始化,也不可以重复赋值。我们举一个例子说明:
/** * @author yangwuyi */class Final { final String S = "two"; { System.out.println("Final's function!对象初始化。。。。。。"); //S = "hello;"; } public Final(String helloWorld) { //S = helloWorld; }}
或者
/** * @author yangwuyi */class Final { final String S ; { System.out.println("Final's function!对象初始化。。。。。。"); S = "hello;"; } public Final(String helloWorld) { //S = helloWorld; }}
或者
/** * @author yangwuyi */class Final { final String S ; { System.out.println("Final's function!对象初始化。。。。。。"); //S = "hello;"; } public Final(String helloWorld) { S = helloWorld; }}
而且有一点都要记住:都不可以重复赋值。
二:final static作为常量的时候,jvm会对其进行优化
一个类中有声明为static final的变量,jvm会对类的加载进行优化,先来看一个对比的例子:
运行结果:
s
解析:因为s是static final变量,且它等于helloWorld,在编译的时候就可以知道它的值,所以直接访问s的值不会引起Final类的初始化。作为表现,也就是static静态代码块不会被加载。
第二:
运行结果:
解析:因为s是static final变量,因为s在编译的时候无法知道它的确切的值,所以只有等到运行的时候才能知道,所以访问s的值会引起Final类的初始化。作为表现,也就是static静态代码块会被加载。
三:final变量不可变的是句柄的地址,其实里面的值可以改变
还是通过例子来说明问题。
/** * @author yangwuyi */public class FinalTest { public static final List TEMPEXM = new ArrayList(); public static void main(String[] args) { FinalTest.TEMPEXM.add("hello "); FinalTest.TEMPEXM.add("world !"); System.out.println(FinalTest.TEMPEXM); }}
运行结果:
final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
第二个例子:
/** * @author yangwuyi */class Final{ static int i = 0;}public class FinalTest { public static void main(String[] args) { Final f = new Final(); changFinalClass(f); } public static void changFinalClass(final Final f) { //f = new Final();//出错 f.i = 100; }}
目的是不允许将引用变量进行重定向,但是引用的值却是可以变化的。
- 深入java final关键字 用法注意点和JVM对其进行的优化(例子)
- 深入java final关键字 基本用法、注意点和优点
- 深入java static关键字 在继承场景中jvm类加载器对其进行的优化
- 深入JVM之类的主动使用和final关键字
- java final关键字的用法
- java final关键字的用法
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- JavaScript中的this关键字的用法和注意点
- 对Java关键字final和static的理解
- 对Java关键字final和static的理解
- 对Java关键字final和static的理解
- java中final和static关键字的用法
- 关于Java中static和final关键字的用法总结
- 将binder和socketpair结合实现任意进程间的双向通讯
- 集算器中如何对excel字段关联取数
- 窗体属性的调用方法
- MySQL数据库(20)
- 总结
- 深入java final关键字 用法注意点和JVM对其进行的优化(例子)
- 面向对象基本理论及三大特征
- AJAX
- Java关键字
- Anaconda 安装额外Python环境 后新环境安装Spyder 打开一闪而过的解决方法
- 5-5
- thinkcmf生成的验证码不显示
- 设计数据库的三大范式是什么?
- Matlab:plot函数学习(1)