Java 与 C# : Java and C# subclasses with method overrides output different results in same scenario

标签 java c# oop inheritance overriding

好的!我用 JavaC# 编写了相同的代码,但输出不同!

class A
{
    public void print() 
    {
        Console.WriteLine("Class A");
    }
}

class B : A 
{
    public void print()
    {
        Console.WriteLine("Class B");
    }
}

class Program
{
    static void Main(string[] args)
    {
        A a = new B();
        a.print();
        Console.Read();
    }
}

输出:A 类。它在 C# 中。

但是当在 Java 中运行相同的代码时,输​​出是 B 类。这是 Java 代码:

class A
{
    public void print() 
    {
        System.out.println("Class A");
    }
}

class B extends A 
{
    public void print()
    {
        System.out.println("Class B");
    }
}


public class Program{

 public static void main(String []args){
    A a = new B();
    a.print();
 }
}

那么,为什么会显示不同的结果?我确实知道,在 Java 中,默认情况下所有方法都是虚拟的,这就是 Java 输出 Class B 的原因。

另一件事是,两种语言都声称它们是由 C++ 产生或启发的,那么为什么它们显示不同的结果,而它们都具有相同的基本语言(Say)。

这行 A a = new B(); 实际上在做什么? a 不是 B 类的持有对象吗?如果是这样,那为什么 C# 显示 Class A 而 Java 显示 Class B

注意 这个问题是在采访中使用上面提供的相同代码提出的。我回答输出 B 类(关于 Java),但他说 A 类 将是正确的输出。

谢谢!

最佳答案

这是因为在 C# 中,派生类的方法隐藏而不是覆盖其基类的方法。您要覆盖的方法需要在基类中用关键字virtual 显式标记,在派生类中用关键字override 显式标记。

相比之下,在 Java 中,默认情况下所有方法都是虚拟的:只需指定相同的签名就足以覆盖。

以下是如何使您的 C# 程序等同于 Java 程序:

class A
{
    public virtual void print() // Add "virtual"
    {
        Console.WriteLine("Class A");
    }
}

class B : A 
{
    public override void print()// Add "override"
    {
        Console.WriteLine("Class B");
    }
}

After A a = new B(), variable a is holding object of B but the output is "Class A"! Shouldn't it call method of class B?

当您隐藏一个方法而不是覆盖它时,您的派生类会同时保留这两种方法——一个在基类中,一个在派生类中。外部调用者仍然可以访问这两种方法。他们可以通过使用适当静态类型的对象来决定调用这两种方法中的哪一种。这是一个例子:

    B b = new B();
    b.print();      // Prints "Class B"
    ((A)b).print(); // Prints "Class A"

Demo on ideone.

当您使用virtual/override 时,您只能从外部访问一种方法 - 即派生类中的方法。基类中的方法可以被派生类的方法访问,但派生类的外部用户不能访问。

关于Java 与 C# : Java and C# subclasses with method overrides output different results in same scenario,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282318/

相关文章:

java - 在 Spring Security 中处理自定义异常

java - getApplicationContext() 问题

c# - 这两种 Post 方法有什么区别

c# - 控制台应用程序中System.Xml的C#错误处理

c++ - S.O.L.I.D 的 S 可以扩展到代码的每个元素吗?

多次在字符串中使用java正则表达式连字符

java - 获取 Java 打印机图形设备

c# - Task.Run 的替代方案

oop - 转换代码应该属于哪个类?

ios - 如何在 Swift 中使用没有类型参数的泛型类?