package example;
class m1
{
public int getInt()
{
return 0;
}
}
class m2 extends m1
{
public int getInt()
{
return 1;
}
}
public class Override
{
public static void main(String[] args)
{
m1 m = new m2();
m.getInt();
System.out.println(m.getInt());
}
}
//输出的是1,说明是调用的是m2的getInt()方法
下面是C#的代码
C# code
namespace test1
{
class Override
{
public int getInt()
{
return 0;
}
}
class InheritOverride : Override
{
public int getInt()
{
return 1;
}
}
class G0
{
static void Main()
{
Override i = new InheritOverride();
int j = i.getInt();
Console.Write(j);//输出的是0,说明调用的是父类的getInt()方法
Console.ReadKey();
}
}
}
疑问:两种语言的重写机制有什么不同吗,C#只有用virtul,abstract,父类的对象才会指向子类的重写方法。而java不是的
------解决方案--------------------
------解决方案-------------------- 举个例子: class BaseClass { public virtual void DoSomething(){} }
class SubClass1 : BaseClass { public override void DoSomething(){} }
class SubClass2 : BaseClass { public new void DoSomething(){} }
然后用基类的类型建两个子类的实例 BaseClass object1= new SubClass1() BaseClass object2= new SubClass2()
C#允许派生类中的方法与基类中的方法具有相同的名称 ; 在基类中引入与派生类中的某个成员具有相同名称的新成员在C#中是完全支持的; 这时你必须明确告诉编译器,你希望的操作是怎么样的! // //new 隐藏方法情况 // class MyClass { public void Get() { Console.WriteLine("He is Father"); } } class YourClass :MyClass { public new void Get() //定义了一个与父类同的名方法 而不是实现父类Get() { Console.WriteLine("He is Son"); } } class Program { static void Main() { YourClass y=new YourClass(); y.Get()//He is Son MyClass m=y; m.Get();//He is Father } } 在派生类中,不加new 程序也会成功编译运行,只不过编译器会发出警告,没有关系不用理它,因为当在派生类上 定义有与基类同名的方法时,编译器的默认行为就是隐藏基类的同名成员! // //Virtual 虚方法 重写实现 // class MyClass { public virtual void Get() { Console.WriteLine("He is Father"); } } class YourClass :MyClass { public override void Get() //子类重新实现Get()方法,但此方法的定义是在父类中 { //如果父类此方法不是被虚virtual的或抽象的abstract, Console.WriteLine("He is Son");//不能使用override关键进行重写 } //public n