五、JAVA中类的探究-类变量的初始化时机
2015-06-09 16:30
351 查看
一、类变量的初始化时机
(1)
JAVA的类不同于C++的类 能在类里执行main函数就是让我惊奇的一点JAVA程序可以在这两个地方对类变量执行初始化:
定义类变量时指定初始值
静态初始化快中对类变量指定初始值
代码如下
public class StaticInitTest { static int count = 2; static { System.out.print("StaticInitTest的静态初始化块:"); name = "JAVA编程"; } static String name = "crazy JAVA"; public static void main(String[] args) { System.out.println("count类变量的值:" + StaticInitTest.count); System.out.println("name类变量的值:" + StaticInitTest.name); } }
运行结果
StaticInitTest的静态初始化块:count类变量的值:2name类变量的值:crazy JAVA
学习心得
针对name类:先赋值为”JAVA编程“ 再赋值为”疯狂JAVA讲义“但运行程序一次 只初始化一次
——————————
百度知道上对于我的疑问的解释:
java属于边解释边执行的语言,java编译的结果是class文件,并能直接在机器上运行,而是又java虚拟机代理的,java虚拟机在解释时是先遍历class文件的,把class文件中所涉及到的类都会遍历到,直接加载到内存中
(2)
代码如下
class Price { final static Price INSTANCE = new Price(2.8); static double initPrice = 20; double currentPrice; public Price(double discount) { currentPrice = initPrice - discount; } public static void main(String[] args) { System.out.println("通过Price的INSTANCE访问currentPrice实例变量:" + Price.INSTANCE.currentPrice); Price P = new Price(3.5); System.out.println("通过显示创建的Price实例P访问currentPrice实例变量:" + P.currentPrice); } }
运行结果
通过Price的INSTANCE访问currentPrice实例变量:-2.8通过显示创建的Price实例P访问currentPrice实例变量:16.5
学习心得
对INSTANCE赋值时调用Price(2.8) 创建Price实例此事立即执行currentPrice赋值 initPrice类变量的值=0
故currentPrice=0-2.8=2.8 程序再将initPrice赋为20
当Price类初始化完成后 INSTANCE类变量引用到一个currentPrice为-2.8的Price实例
此时initPrice=20.0
————————————
final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
相关文章推荐
- Spring mvc 返回json格式
- MyBatis3整合Spring3、SpringMVC3
- mybatis 异常:There is no getter for property named 'classId' in 'class java.lang.Integer'
- 分页控件:pager-taglib与SpringMVC结合实例
- 关于spring mvc时间类型绑定失败解决方法
- 栈的数组实现(动态调整数组大小) JAVA版本
- JAVA的json处理器fastjson
- win7 JAVA Jdk安装与配置
- java内存
- java Double保留小数点位数
- java 工具栏
- java Thread state 分析
- java 根据经纬度获取地址
- Java中Comparable和Comparator实现对象比较
- spring 获取自定义配置文件properties中参数
- java 字符串拼接的单元测试
- 万年历(java实现)
- 万年历(java实现)
- 搭建Hibernate4开发环境并整合Spring3
- Java反射机制