C#和Java中的继承差异

本文关键字:继承 Java | 更新日期: 2023-09-27 18:00:05

我和我的一位Java程序员朋友讨论了继承问题。当我们对同一类代码得到不同的结果时,对话几乎达到了高潮。我在.NET中的代码:

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Base objBaseRefToDerived = new Derived();
            objBaseRefToDerived.Show();
            Console.ReadLine();
        }
    }
    public class Base
    {
        public virtual void Show()
        {
            Console.WriteLine("Show From Base Class.");
        }
    }
    public class Derived : Base
    {
        public void Show()
        {
            Console.WriteLine("Show From Derived Class.");
        }
    }
}

给我这个结果:

从基类显示。

当代码这个代码在Java

public class Base {
    public void show() {
        System.out.println("From Base");
    }
}
public class Derived extends Base {
    public void show() {
        System.out.println("From Derived");
    }
    public static void main(String args[]) {
        Base obj = new Derived();
        obj.show();
    }
}

给我这个结果:

来自衍生

为什么.NET调用基类函数而java调用派生类函数?如果有人能回答这个问题,或者只是提供一个链接,我可以澄清这个困惑,我将不胜感激。

我希望提供的代码没有任何问题。

C#和Java中的继承差异

不同之处在于,当您在Java中"覆盖"Show方法时,您在C#版本中"隐藏"了它。

要获得相同的行为:

public class Derived : Base
{
    public override void Show()
    {
        Console.WriteLine("Show From Derived Class.");
    }
}

在java中,默认情况下每个方法都是虚拟的并且不需要将方法标记为overriden。在C#中,您必须指定virtual和override关键字,否则它实际上是一个新方法。您将收到一个警告,应该选择new或override关键字来隐藏此警告。

注意:Java有一个可以使用的属性@Override,但它的使用是可选的。