首先Java中类的成员方法,默认都是virtual的,C#要显示的标注virtual才行。默认的,Java中子类的同名方法会覆盖父类的同名方法,而C#中,需要显示的标注override才行。
例如下面的例子。
Java代码:注:Java和C#不同,多个public类不可以写在一个文件,而C#无此限定。
- public class JavaApplication1 {
- public static void main(String[] args) {
- // TODO code application logic here
- father f = new son();
- f.show();//输出son
- }
- }
- //父类
- public class father {
- public void show()
- {
- System.out.append("father");
- }
- }
- //子类继承父类
- public class son extends father{
- public void show()
- {
- System.out.append("son");
- }
- }
输出的是son。默认的,Java类中的方法默认都是虚方法,如果子类重写一个从父类中继承来的方法,子类会覆盖此方法。程序运行的时候,会根据对象的运行时类型选择调用相应的方法。
再看C#的代码,如果按照Java的方式那样书写:
- public class Program
- {
- static void Main(string[] args)
- {
- father f = new son();
- f.show();//输出的是father
- }
- }
- public class father
- {
- public void show()
- {
- Console.WriteLine("father");
- }
- }
- public class son : father
- {
- public void show()
- {
- Console.WriteLine("son");
- }
- }
C#中输出的是father。
具体分析可以参阅
C#中,如果和Java同样写法,子类并不会覆盖父类方法。事实上C#中默认的是new关键字修饰方法的。
C#要实现上面如Java的多态形式,必须显示的声明virtual和override才行。即如下写法:
- public class Program
- {
- static void Main(string[] args)
- {
- father f = new son();
- f.show();
- }
- }
- public class father
- {
- virtual public void show()
- {
- Console.WriteLine("father");
- }
- }
- public class son : father
- {
- public override void show()
- {
- Console.WriteLine("son");
- }
- }
Java中没有关键字和C#中的new对应。