5.1.7-5.1.10阻止继承+(笔记)
1. 阻止继承.
-
1.final相关
1.final作用于类表不允许拓展(继承).final作用于方法表禁止覆盖.
2.final类中的方法自动为final方法.但不包括域
3.将方法或类声明为final的主要目的是确保它们不会在子类中改变语义 -
2.内联机制.
如果一个方法未被覆盖并且很短,编译器将对它进行优化处理,这种方式称为内联.例如,内联调用e.getName()将被替换为e.name.- 1.为什么这么处理??
这是由于CPU在处理方法调用时,使用的分支转移会扰乱预取指令的策略.
但如果getName在另一个类中被覆盖,那么编译器就无法知道被覆盖的代码会执行什么操作,因此就不会对它进行内联处理了.但幸运的的是,虚拟机中的即时编译器比传统编译器处理能力强得多.它可以知道类之间的继承关系,并能检测到类中是否真正的覆盖了给定的方法.如果方法简短、频繁调用且没有真正的被覆盖,那么即时编译器将对方法进行内联处理,否则取消优化.
- 1.为什么这么处理??
2. 强制类型转换.
进行类型的强制转换的唯一原因是:暂时忽略对象的实际类型而使用对象的全部功能.例如将Employee数组中引用经理的元素还原为Manager类,以便能够访问新增加的所有方法或变量.将子类的引用赋值给超类变量,编译器是允许的,<font size="3"color="red">但是将超类的引用赋给子类变量,就必须进行类型转换
- 1.错误出现的两种情况.
- a.试图在继承链上进行从上到下的类型转换,但"谎报了"有关对象包含的内容.如Manger boss=(Manager) staff[1];<font size="3"color="red">这将导致运行时异常ClassCastException
- b.试图进行非继承层次之间的转换.如String c=(String)staff[1];
- 2.使用instanceof操作符.


- 3.什么时候进行强制类型转换.
通过类型转换调整类型并不是一种好的方法,很多情况不需要进行对象类型转换.一般情况应尽量少使用类型转换和instanceof运算符.- a.利用多态性的动态绑定机制就能够自动地找到相应方法时不需要.
- b.使用特定方法时可以进行类型转换.
- 4.C++注释.
Java的类型转换语法来自于C语言,但处理过程去类似于C++的dynamic_cast操作.但它与C++有一点区别是:<font size="3"color="red">当类型转换失败时,Java不会生成null对象,而是抛出一个异常.
3.抽象类.
为了提高代码的清晰度,包含一个或者多个抽象方法的类必须被声明为抽象的.其中抽象方法起着占位的角色.
- 1.两点注意.
- a.类即使不包含抽象方法,也可以被声明为抽象类.
- b.抽象类不能被实例化.
- 2.C++注释.
- a.C++中的纯虚函数是一种在尾部用=0标记的抽象方法.如:virtual String getDescription()=0;
- b.只要有一个纯虚函数,这个类就是抽象类.而C++中没有提供表示抽献类的特殊关键字.
- 3.书中Person抽象类数组中函数调用问题.
由于不能构造抽象Person类的对象,所以变量p永不会指向Person对象,而是指向具体子类对象,而这些对象中都实现了具体的getDescription方法.
4.受保护的访问.
在实际应用中,应该谨慎的使用protected属性,如果将设置了受保护的域的类给其他程序员使用,那么其他程序员就可以派生出新类并访问其中的protected域.而一旦需要对这个类进行修改就不得不通知使用了这个域的其他程序员,这明显<font size="3"color="red">违背了OOP提倡的数据封装原则.
- 1.四种修饰符.


浙公网安备 33010602011771号