目录
8.2 多态
Music:多态
class Instrument {
void play() {
System.out.println("Instrument!");
}
};
class Wind extends Instrument {
void play() {
System.out.println("Wind!");
}
};
class Percussion extends Instrument {
void play() {
System.out.println("Percussion!");
}
};
class Music {
static void tune(Instrument i) {
i.play();
}
public static void chapter8_2() {
Wind wind = new Wind();
Percussion percussion = new Percussion();
tune(wind);
tune(percussion);
}
};
输出:
Wind!
Percussion!
PrivateOverride:私有函数不支持多态,privateOverride.f()实际运行的是基类的f()。
class PrivateOverride {
/*
public void f() {
System.out.println("PrivateOverride!");
}
*/
private void f() {
System.out.println("PrivateOverride!");
}
public static void chapter8_2() {
PrivateOverride privateOverride = new Derived();
privateOverride.f();
((Derived)privateOverride).f();
}
};
class Derived extends PrivateOverride {
public void f() {
System.out.println("Derived PrivateOverride!");
}
}
输出:
PrivateOverride!
Derived PrivateOverride!
8.3 构造器和多态
构造器并不具有多态性,它们实际上是static方法,只不过声明是隐式的!!!
PolyConstructors:如果一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生灾难性的结果。
class Glyph {
Glyph() {
System.out.println("Glyph before draw:");
draw();
System.out.println("Glyph after draw:");
}
void draw() {
System.out.println("Glyph draw()!");
}
};
class RoundDraw extends Glyph {
RoundDraw(int r) {
radius = r;
System.out.println("RoundDraw draw()!!! radius:" + radius);
}
private int radius = 2;
void draw() {
System.out.println("RoundDraw draw()! radius:" + radius);
}
};
class PolyConstructors {
public static void chapter8_3() {
new RoundDraw(5);
}
};
输出:
Glyph before draw:
RoundDraw draw()! radius:0
Glyph after draw:
RoundDraw draw()!!! radius:5
draw()前后radius打印不同,也就是说对于Glyph类来说打印draw看到的radius是个错误的值!!!
编写构造器时有一条有效的准则:"用尽可能简单的方法使对象进入正常状态,如果可以的话避免调用其他方法"