为什么这种处理方法的差异在Java和& C#?

时间:2013-06-06 11:31:02

标签: c# java oop

我有两个班A& B,其中B来自A。

两个类都有一个具有相同签名的方法。它们在Java和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

为什么输出不同?

3 个答案:

答案 0 :(得分:16)

在Java中,默认情况下方法为virtual 在C#中,默认情况下,方法 virtual

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

或者,为了使Java代码的行为与C#代码相同,请在基类中创建方法final

答案 1 :(得分:6)

在c#的情况下,您需要将父方法作为虚拟和子方法作为覆盖

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

答案 2 :(得分:2)

这一行:

  A a1=new B();

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