C#和Java在重写上的区别
C#
class A { public string Get1() { return "A1"; } public virtual string Get2() { return "A2"; } } class B:A { public string Get1() //此处会出现提示:隐藏继承的成员“Program.A.Get1()”。如果是有意隐藏,请使用关键字 new { return "B1"; } public override string Get2() { return "B2"; } } static void Main(string[] args) { A a = new B(); Console.WriteLine(a.Get1()); //结果为A1,原因Get1()方法之间并没有形成重写,调用A的Get1()方法 Console.WriteLine(a.Get2()); //结果为B2,原因Get2()方法之间形成了重写,会调用B的方法 }
C#此段代码是能正常编译运行的,但是会出现警告提示。
另C#所有子父类方法的重写,必须在父方法上使用abstract,virtual等关键字修饰,且在子方法使用override关键字修饰。否则编译器则会视为不同的方法。
Java public class A { public long Get() { return 4; } } public class B extends A { public int Get() //此处会出现错误提示,attempting to use incompatible return type,即“尝试使用不相容的返回类型”,可以看出对于同名同参方法,不管返回类型是否相同,编译器都会认为子类在尝试复写父类方法,这时会要求返回类型必须相同 { return 5; } }
此段java代码编译不会通过