为什么Java中处理方法歧义的差异如此之大?c#

本文关键字:如此之 Java 处理 方法 歧义 为什么 | 更新日期: 2023-09-27 18:17:23

我有两个类A &B,其中B来源于a。

两个类都有一个签名相同的方法。它们在Java中的调用方式如下:c# ->


对于JAVA:

class A
{
    public void print()
    {
        System.out.println("Inside Parent");
    }
}
class B extends A
{
    public void print()
    {
        System.out.println("Inside Child");
    }
}
class test4
{
    public static void main(String args[])
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
    }
}

程序生成以下输出:-

Inside Child
Inside Child

对于c#:

class A
{
    public void print()
    {
        System.Console.WriteLine("Inside Parent");
    }
}
class B : A
{
    public void print()
    {
        System.Console.WriteLine("Inside Child");
    }
}
class Program
{
    public static void Main(string[] args)
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
        System.Console.Read();
    }
}

程序生成以下输出:-

Inside Child
Inside Parent

为什么输出不同?

为什么Java中处理方法歧义的差异如此之大?c#

在Java中,方法默认是virtual
在c#中,方法默认是而不是 virtual

因此,为了使c#代码的行为与Java代码相同,使virtual方法在基类中,override方法在派生类中。

或者,为了使Java代码的行为与c#代码相同,在基类中设置方法final

在c#的情况下,你需要使父方法为virtual,子方法为override

class A
{
public virtual void print()
{
System.Console.WriteLine("Inside Parent");
}
}
class B : A
{
public override void print()
{
System.Console.WriteLine("Inside Child");
}
}
class Program
{
public static void Main(string[] args)
{
B b1=new B();
b1.print();
A a1=new B();
a1.print();
System.Console.Read();
}
}

这一行:

  A a1=new B();

我想在这里,在c#中你有一个方法隐藏的例子。也许您需要显式地将方法声明为被覆盖(例如在java中使用@Override注释)。