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

Thinking in Java 第7章 多形性 总结

2016-08-23 16:20 323 查看
1.关于java的特性。

本书中提到的:数据抽象,继承,多形性(多态性)

普遍说法是:封装,继承,多态性

也有说四大特性的:抽象,封装,继承,多态性

归纳的不同,但意思是一样的。

2.上一章中对上溯造型有了基本了解,这一章继续对此进行深入研究,以探讨多形性。(test项目:ExtendsTest)

3.java中的绑定(另有篇幅研究

4.抽象类、抽象方法:abstract(另有篇幅研究,同时注意test项目:abstractTest)

5.接口:interface(另有篇幅研究,同时注意test项目:InterfaceTest)

6.内部类(另有篇幅研究,同时注意test项目:InnerClassTest)

7.本章再次提到构建器,尽管构建器并不具有多形性,但仍然非常有必要理解构建器如何在复杂的分级结构中以及随同多形性使用。

构建器的调用遵照下面的顺序:

(0) 分配内存空间(基本数据类型会被初始化为0值,其余为null)

(1) 调用基础类构建器。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个衍生类,等等。直到抵达最深一层的衍生类。

(2) 按声明顺序调用成员初始化模块。(注:实际上会优先按顺序初始化static的初始化模块)

(3) 调用衍生构建器的主体。

值得一提的是,如果基础类中的构造方法,调用了一个需要动态绑定的方法(比如父类子类都有这个方法),实际调用的就是子类的对应方法(但并不会完整的初始化子类),这样就可能导致各种异常(打乱了初始化节奏,部分值没正确初始化)。所以不建议如此使用。

下面这个例子,根据书中例子改编,更能说明问题,运行直接报空指针。(Integer未初始化时是null)

class Glyph {
void draw(){
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
Integer radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = "+ radius);
}
void draw() {
radius++;
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}

8.关于如何利用多形性进行设计,本书推荐了这样一个原则:用继承(含implements)表达行为间的差异,并用成员变量表达状态的变化。(但这个原则不是唯一的,也不是必须的,具体如何使用多形性,要视情况而定)

9.上溯造型肯定是安全的,但下溯造型则不一定。在 Java 中,所有造型都会自动得到检查和核实!所以即使我们只是进行一次普通的括弧造型,进入运行期以后,仍然会毫无留情地对这个造型进行检查,保证它的确是我们希望的那种类型。如果不是,就会得到一个ClassCastException(类造型违例)。在运行期间对类型进行检查的行为叫作“运行期类型标识”(RTTI)。

10.String 类从编译器获得了额外的帮助,使其能够正常工作。某些情况下(如字符串的+ 或直接打印一个类),只要编译器期待的是一个String 对象,但它没有得到一个,就会自动调用在Object 里定义、并且能够由任何Java 类覆盖的 toString()方法。(有时候null会被转为“null”字符串)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: