您的位置:首页 > 编程语言 > Java开发

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)即时编译器对方法进行内联处理: 虚拟机中的即时编译器比传统编译器的处理能力强得多, 这个编译器可以准确谁知道类之间的继承关系,并能够检测出类中是否

真正地存在覆盖给定的方法, 如果方法很短,被频繁调用且没有真正地被覆盖,那么即时编译器就会将这个方法进行内联处理;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息