1. C#的方法(method)缺省是不能被继承类改写的;如果希望被继承类改写,则需要显式加上关键字virtual,并且在继承类改写该方法的时候还要加上override关键字。而java默认所有可被继承类访问到的方法(非private方法)是可以被改写的,除非该方法被标记为final方法。
个人喜好:还是觉得java的处理方式比较简洁。而且在.NET架构下调用一个virtual方法,比起调用一个普通方法,性能上的差别应该很小了(没有在c++里面的那种性能差别),既然如此,为什么要引入virtual, override, new这么多的关键字,把问题是不是搞复杂了???
2. 初次接触.NET里面的custom attribute,并没有觉得它是多大的创新。但是随着对.NET了解的深入,发觉custom attribute确实是很了不起的。有了它,就没必要像java那样引入一些不包含任何方法的mark interface,直接通过attribute标记更漂亮。再比如NUnit,开始也是使用Reflection来寻找测试方法,后来通过attribute来标记,确实更好一些。J2SE 5.0准备引入metadata,应该是Java向.NET学习的结果。
3. C#引入的delegate和event,个人感觉对提高编程方便性还是有帮助。像java那样通过interface和observer模式来处理事件的方式,虽然也很通用,但是毕竟要多写一些代码来处理register/unregister observable对象的重复代码,而delegate将这些地方封装起来了。但是delegate毕竟只能声明一个"回调函数",如果类里面有很多事件(比如Button),类的对外接口就显得很庞大了。