您现在的位置是:首页
>
多形性肿瘤什么意思 多形性的覆蓋与过载
多形性的覆蓋与过载 现在让我们用不同的眼光来看看本章的头一个例子 在下面这个程序中 方法 lay 的接口会在被覆蓋的过程中发生变化 这意味着我们实际并没有 覆蓋 方法 而是使其 过载 编译器允许我
多形性的覆蓋与过载

现在让我们用不同的眼光来看看本章的头一个例子 在下面这个程序中 方法play()的接口会在被覆蓋的过程中发生变化 这意味着我们实际并没有 覆蓋 方法 而是使其 过载 编译器允许我们对方法进行过载处理 使其不报告出错 但这种行为可能并不是我们所希望的 下面是这个例子 //: WindError java // Accidentally changing the interface class NoteX { public static final int MIDDLE_C = C_SHARP = C_FLAT = ; } class InstrumentX { public void play(int NoteX) { System out println( InstrumentX play() ); } } class WindX extends InstrumentX { // OOPS! Changes the method interface: public void play(NoteX n) { System out println( WindX play(NoteX n) ); } } public class WindError { public static void tune(InstrumentX i) { // i play(NoteX MIDDLE_C); } public static void main(String[] args) { WindX flute = new WindX(); tune(flute); // Not the desired behavior! } } ///:~ 这里还向大家引入了另一个易于混淆的概念 在InstrumentX中 play()方法采用了一个int(整数)数值 它的标识符是NoteX 也就是说 即使NoteX是一个类名 也可以把它作为一个标识符使用 编译器不会报告出错 但在WindX中 play()采用一个NoteX句柄 它有一个标识符n 即便我们使用 play(NoteX NoteX) 编译器也不会报告错误 这样一来 看起来就象是程序员有意覆蓋play()的功能 但对方法的类型定义却稍微有些不确切 然而 编译器此时假定的是程序员有意进行 过载 而非 覆蓋 请仔细体会这两个术语的区别 过载 是指同一样东西在不同的地方具有多种含义 而 覆蓋 是指它随时随地都只有一种含义 只是原先的含义完全被后来的含义取代了 请注意如果遵守标准的Java命名规范 自变量标识符就应该是noteX 这样可把它与类名区分开 在tune中 InstrumentX i 会发出play()消息 同时将某个NoteX成员作为自变量使用(MIDDLE_C) 由于NoteX包含了int定义 过载的play()方法的int版本会得到调用 同时由于它尚未被 覆蓋 所以会使用基础类版本 输出是 InstrumentX play() lishixinzhi/Article/program/Java/JSP/201311/19231
很赞哦! (1025)