Java中的方法覆盖原则是否与C#不同?我为c#工作,现在要求在java中调试代码。
它只是为了澄清我的概念。我有一个代码覆盖c#中的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
public class A
{
public void Food()
{
Console.Write("1");
}
}
public class B : A
{
public void Food()
{
Console.Write("2");
}
}
public class program
{
static void Main(string[] args)
{
A a = new B();
a.Food();
Console.ReadLine();
}
}
}
OUTPUT -1(毫无疑问)(在C#中)但是当我在java中执行相同的代码时,我得到了" 2"。 只是好奇地知道原因,因为压倒一切的原则在语言上可能有所不同。我没有java的经验。
由于
答案 0 :(得分:7)
在C#中,如果要使方法可覆盖,则必须在超类中使用关键字virtual
。查看您的示例,如果您已将virtual
添加到课程Food
中的方法A
,则输出将为2
而不是1
:< / p>
public class A
{
public virtual void Food()
{
Console.Write("1");
}
}
在Java中,没有virtual
个关键字。方法自动virtual
。没有办法在Java中创建非虚拟方法来获得与C#相同的行为。
答案 1 :(得分:0)
其他信息,基于您的示例
A a = new B()
a.Food();
被调用的Foo
方法是A
类中的方法。
如果我改变使用的类型
,该怎么办? B a = new B()
a.Food();
因此,在这种情况下,现在调用的方法是类Foo
的{{1}}方法。
因此,并非所有超类的方法都具有更高的优先级,它对于您使用哪种类型来声明对象也很重要。
与接受的答案一样,您需要一个B
关键字来允许C#中的方法覆盖。最佳做法是在派生类中指定virtual
方法。
override
那么,如果我有另一个继承派生类的类呢? (第三级继承)
public class A
{
public virtual void Food()
{
Console.Write("1");
}
}
public class B : A
{
public override void Food()
{
Console.Write("2");
}
}
因此,无需将public class C : B
{
public override void Food()
{
Console.Write("2");
}
}
设置为虚拟,只需在最深层次中指定override关键字。