为什么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中,方法默认是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注释)。