final 实例域+final类+final方法(阻止继承)
2015-11-07 13:32
218 查看
【0】README
0.1)本文描述+源代码均 转自 core java volume 1, 旨在理清 “final 实例域”;0.2) 最后还增加了 阻止继承 的内容,涵盖了final类+final方法;
0.3) 引入了 内联 以及 即时编译器对方法进行内联处理 ;
【1】final相关
1.1) final 大都应用于 基本数据域, 或不可变类的域; final 域被设置后, 不能再对它进行更改, 即没有 setter 更改器方法;1.2)不可变的类:如果类中的每个方法都不会改变其对象,这种类就是不可变的类;
1.3)对于可变的类: 使用final修饰符可能会对读者造成混乱,如:private final GregorianCalendar entryTime;
Attention)
A1)这仅仅意味着存储在 entryTime 变量中的对象引用在对象构造后不能被改变, 并不是说 entryTime 对象是一个常量, 任何方法都可以对 entryTime 引用的对 象调用 setTime更改器(注意,这里是 setTime(), 而不是 setEntryTime() ); (也就是说,entryTime 指针只能指向 初始化的 内存地址空间, 虚拟机停止运行前,它不能指向另外的内存地址空间)
A2)也即是, 对于final的 对象(对象就是引用)变量来讲,它在对象创建的时候, 它所引用的地址是至始至终不会改变的, 但是该引用地址(对象)上的值是可以改变的, 下图中的 setTime 更改了final entryTime 的 日历日期,但是没有改变它的引用地址;
【2】看个荔枝:
【3】阻止继承:final 类 和 方法
3.1)不允许扩展的类被称为final类: 如,final class Executive extends Manager { ...... }
3.2)类中的方法也可以被声明为final, 那么,子类就不能覆盖这个方法了(final类中的所有方法自动地成为final方法)
class Employee { ...... public final String getName() { return name; } }
Annotation) 对于final域来说,构造对象后就不允许改变他们的值了,不过如果将一个类声明为final, 只有其中的方法自动地成为final, 而不包括域;
3.3)内联:如果一个方法没有被覆盖并且很短,编译器就能够对它进行优化处理,这个过程就称为内联;如, 内联调用e.getName() 将被替换为 访问 e.name 域;
3.4)即时编译器对方法进行内联处理: 虚拟机中的即时编译器比传统编译器的处理能力强得多, 这个编译器可以准确谁知道类之间的继承关系,并能够检测出类中是否
真正地存在覆盖给定的方法, 如果方法很短,被频繁调用且没有真正地被覆盖,那么即时编译器就会将这个方法进行内联处理;
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统