
public class ParentClass
{
public int test(int i)
{
return i * 2;
}
}

public class DerivedClass extends ParentClass
{
public int test(int i)
{
return i * 2 + 1;
}
}

public class Test
{
public static void main(String[] args)
{
ParentClass a = new DerivedClass();
System.out.println(a.test(0)); //输出结果为1
}
}
接着,ParentClass的代码改为:

public class ParentClass
{
public int test(int i, boolean flag)
{
if (flag)
return i * 2;
else
return 0;
}
}
通过IDE的支持,我们可以找到使用test方法的地方,也就将main函数中的调用改为:System.out.println(a.test(0, true)); 虽然这样的改动并不会引发编译错误,在运行的时候也没有问题,但是很明显,输出结果变为了0,程序已经不再按照我们的意图而执行了,因为调用的是从父类继承过来的test方法,而不是我们原来所要求的调用覆写的方法了。像这样的bug是很难被发现的,如果不是因为程序在运行过程中出现了死循环,都不知道这个潜在的bug会在什么时候突然爆发。
以上给出的例子已经很好的说明了C#使用override关键字的必要性。对应着C#,以上代码的DerivedClass中的test方法就要被声明为override,一旦ParentClass中的test方法发生了改变,编译器就会在编译过程发现这个错误。可见语言定义的严谨还是能够在很大程度上帮助程序员在开发中少犯错的。事实上,Java也意识到了这个方面的不足,也在语言定义上作了改进:通过使用内建的Override注释(Annotation)来避免以上提到的问题(参见参考文章[1])。个人觉得,Java的解决方案似乎更加优美,因为它是通过提供一个机制实现了继承上的制约,而非增加关键字。
参考文章:[1] [3]
document.getElementById('loading').style.display="none";