【问题标题】:Method Overriding-C# vs java方法覆盖-C# vs java
【发布时间】:2016-07-19 08:08:02
【问题描述】:

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();

        }
    }

}

输出-1(毫无疑问)(在 C# 中)但是当我在 java 中执行相同的代码时,我输出为“2”。 只是想知道原因,因为最重要的原则在语言上可能会有所不同。对不起,我没有 java 经验。

谢谢

【问题讨论】:

  • 您通过A 的变量使用B 的实例,但基本上您在B 实例上调用Food(),因此您得到2。
  • 与C#相比,Java中的方法自动为virtual
  • @KevinEsche,@Thomas - 我对此没有反话,我完全同意,但我的问题基本上是“java 如何有不同的输出”,尽管它是相同的编码原则

标签: java c# oop


【解决方案1】:

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

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

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

【讨论】:

  • 好的。非常感谢。我没有在 c# 中故意使用 virtual 。谢谢你澄清我的疑问。 Java不同于c#
  • 最后一句话说对了一半。您可以使用final 关键字在Java 中创建非虚拟方法。但是派生类不能包含同名的方法。因此,您确实不能创建相同的行为。
  • @Dennis_E 你说的也对了一半...如果你创建一个方法final 那么子类可以包含一个同名的方法,但不能具有相同的名称和相同的参数(相同的方法签名),换句话说,您不能覆盖该方法,但仍然可以有重载的版本。
  • @Jesper 你说得对,我应该说签名。这就是我的意思,但我并不准确。
【解决方案2】:

其他信息,基于您的示例

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

调用的Foo方法是A类中的方法。

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

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

所以在这种情况下,现在调用的方法是 B 类的 Foo 方法。

因此,并非所有时候超类的方法都具有更高的优先级,您使用哪种类型来声明对象也很重要。

与接受的答案一样,您需要一个 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 关键字即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2020-01-30
    • 2014-09-28
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多