方法重写-C#vs java

时间:2016-07-19 08:08:03

标签: java c# oop

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的经验。

由于

2 个答案:

答案 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关键字。