站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题对象继承和overload的问题。比较难的一道SCJP考题,我晕了。

对象继承和overload的问题。比较难的一道SCJP考题,我晕了。

摘要: 对象继承和overload的问题。比较难的一道SCJP考题,我晕了。


代码如下:
class SuperBase{ void print(SuperBase a){ System.out.print("Super ");}}
class Base extends SuperBase{ void print(Base a){ System.out.print("Base ");} }
class Derived extends Base{ static void print(Derived c) { System.out.print("Derived "); }}

public class Test {
public static void main (String [] args) {
SuperBase a1 = new SuperBase();
SuperBase b1 = new Base();
Base c1 = new Derived();

a1.print(new Base()); // line1,输出Super
b1.print(new Derived()); // line2,输出Super
c1.print(new Derived()); // line3,输出Base

}
}

SuperBase,Base,Derived 三个类的print方法应该算重载(overload),
第一个:line1 里的new Base()被向上转型(upCasting),所以调用SuperBase的pring()方法输出"Super"。
第二个:应该是传说的动态绑定,所以应该调用Base里的print()方法的。为何没有呢?(注:难到因为Base()里没有Base(new Derived()这个构造函数,又转向了SuperBase里??))
第三个:解释不下去了,高手说说吧......


static void print(Derived c)注意这里的static 所以说Derived并没有对父类覆盖




不理解。顶。。


去掉static也是一样的结果呀.希望有大牛来解惑.........
up~!


覆盖方法的规则:
1、具有相同的signature(即方法名,参数类型,顺序都一样)
2、比它所覆盖的方法访问性更宽。
3、比它所覆盖的方法抛出更少的异常(即:同样或子类的异常,或不抛出)。unchecked异常不遵守这条规则,比如:RuntimeException()
4、静态的不能被非静态覆盖. 非静态的不能被静态覆盖.

这样理解的话,问题很明显,Base和Derived 都不是覆写(override)父类的方法,所以这里是方法的重载而不是覆写,不具有多态的特性.既然不是多态,调用方法就是根据编译期类型(或者说形式类型)来调用.
比如
SuperBase a1 = new SuperBase();
a1的编译期类型就是SuperBase,所以他调用SuperBase的print方法,打印Super


函数参数都不一样,根本就没有复写过任何方法。。


呵呵,没看到lss的。。不然不发了>_<


明白了


↑返回目录
前一篇: Applet 三色渐变填充三角形
后一篇: 请教输入输出 | ~输入输出