方法重写——C#与java

本文关键字:java 方法 重写 | 更新日期: 2023-09-27 17:57:40

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

感谢

方法重写——C#与java

在C#中,如果要使方法可重写,则必须在超类中使用关键字virtual。看看您的示例,如果您将virtual添加到类A中的方法Food中,则输出将是2而不是1:

public class A
{
    public virtual void Food()
    {
        Console.Write("1");
    }
}

在Java中,没有virtual关键字。方法自动为virtual。在Java中,没有办法使方法成为非虚拟的,从而获得与C#相同的行为。

其他信息,基于您的示例

A a = new B() a.Food();

被调用的Foo方法是A类内部的方法。

如果我改变了我使用的类型,

B a = new B() a.Food();

因此,在这种情况下,现在调用的方法是类BFoo方法。

因此,并不是所有时候,一个超类的方法都有更高的优先级,它只取决于你用哪种类型来声明一个对象。

所以,和已接受的答案一样,您需要一个virtual关键字来允许在C#中重写方法。最好在派生类中指定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");
    }
}

因此,无需将B设置为虚拟,只需在最深层指定override关键字即可。