final 实例域+final类+final方法(阻止继承)

来源:互联网 发布:js indexof undefined 编辑:程序博客网 时间:2024/05/18 00:25

【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)即时编译器对方法进行内联处理: 虚拟机中的即时编译器比传统编译器的处理能力强得多, 这个编译器可以准确谁知道类之间的继承关系,并能够检测出类中是否
真正地存在覆盖给定的方法, 如果方法很短,被频繁调用且没有真正地被覆盖,那么即时编译器就会将这个方法进行内联处理;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新生儿头竖立0分怎么办 20天的宝宝便秘怎么办 出生23天的宝宝便秘怎么办 喝奶粉的宝宝便秘怎么办 抱孩子抱的驼背怎么办 4岁宝宝不拉屎怎么办 小朋友大便拉不出来怎么办 儿童便秘拉不出来怎么办 没感冒喉咙有痰怎么办 宝宝喂不进去药怎么办 新生儿只放屁不拉大便怎么办 新生儿腹胀不拉大便怎么办 8月宝宝咳嗽有痰怎么办 2个月婴儿惊吓怎么办 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办 一天大便二三次不消化怎么办 不消化没胃口几天不大便怎么办? 两个月的宝宝拉绿屎怎么办 肠胃不好消化功能差怎么办