当前位置: 首页 > 面试题库 >

Java继承与C#继承

骆磊
2023-03-14
问题内容

假设Java具有以下层次结构类:

class A 
{
}
class B extends A
{
    public void m()
    {
        System.out.println("B\n");
    }
}
class C extends B
{
    public void m()
    {
        System.out.println("C\n");
    }
}
class D extends C
{
    public static void main(String[] args)
    {
        A a = new D();
        // a.m(); // doesn't work
        B b = new D();
        b.m();
        C c = new D();
        c.m();
        D d = new D();
        d.m();
    }
}

这是C#中相同代码的(盲)重复:

using System;
class A 
{   
}
class B : A
{
    public void M()
    {
        Console.WriteLine("B");
    }
}
class C : B
{
    public void M() // I need to use public new void M() to avoid the warning
    {
        Console.WriteLine("C");
    }
}
class D : C
{
    public static void Main(String[] args)
    {
        A a = new D();
        // a.M(); // doesn't work       
        B b = new D();
        b.M();
        C c = new D();
        c.M();
        D d = new D();
        d.M();
    }
}

当我执行Java代码时,我得到了C-C-CC#返回的信息B-C-C

对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。

  • Java设计者决定打印C-C-C而不是打印的逻辑是B-C-C什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么?
  • 如何更改Java代码以B-C-C像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方法?
  • 如何更改C#代码以打印出来C-C-C?我的意思是,我该如何教导C#调用重写方法?

问题答案:

用于虚函数定义:

虚拟函数或虚拟方法是一种功能或方法,其行为可以在继承类中被具有相同签名的函数覆盖。这个概念是面向对象编程(OOP)的多态性部分中非常重要的一部分。

在C#中,您应该将方法声明为virtual以便被覆盖,如MSDN中所示:

  • C#语言规范 虚拟关键字
  • C#虚拟

由于该M方法不是虚拟的,因此b.M()即使b变量实际上是一个D实例,它也将执行。

在Java中,每个非静态方法默认情况下都是虚拟的,因此,当您覆盖某个方法(甚至没有@Override注释)时,的行为b.M()将是d.M()继承该c.M()方法行为的。

我如何像C#一样更改Java代码以打印出BCC?我的意思是,我怎么教Java调用它使用的完全引用的方法?

您根本无法在Java中做到这一点。该M在方法C类将重写M的方法B。将final修饰符添加B#M只会使该修饰符C或其他B子项无法覆盖该M()方法。

如何更改C#代码以打印出CCC?我的意思是,我该如何教导C#调用重写方法?

将类中的M方法更改Bvirtual并在类中重写它C

class B : A
{
    public virtual void M()
    {
        Console.WriteLine("B");
    }
}
class C : B
{
    public override void M() // I need to use public new void M() to avoid the warning
    {
        Console.WriteLine("C");
    }
}


 类似资料:
  • 本文向大家介绍C++多重继承与虚继承分析,包括了C++多重继承与虚继承分析的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系

  • 主要内容:1、基类和派生类,2、多重继承继承与 封装和 多态被统称为面向对象编程的三大特性,本节我们主要来介绍一下继承这一特性。 在创建一个新类时,我们可以使用这个新定义的类继承一个已有的类,通过继承可以在创建新类时重用、扩展和修改被继承类中定义的成员。被继承的类称为“基类(父类)”,继承基类的类称为“派生类(子类)”。 需要注意的是,C# 中只支持单继承,也就是说一个派生类只能继承一个基类,但是继承是可以传递的,例如 ClassC 继

  • 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。 当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • 主要内容:1. 基础和派生类,2. 访问控制和继承面向对象编程中最重要的概念之一是继承。继承允许根据一个类定义另一个类,这样可以更容易地创建和维护一个应用程序。 这也提供了重用代码功能和快速实现时间的机会。 在创建类时,程序员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和成员函数。 此现有类称为基类,新类称为派生类。 继承的想法实现了这种关系。 例如,哺乳动物是一个种类的动物,狗是一种哺乳动物,因此狗是一个动物等等。 1. 基础和派

  • 本小节我们将学习 Java 的继承,通过本小节的学习,你将知道什么是继承,继承有什么特点,如何实现继承,方法重写的概念和实现,方法重写和方法重载是比较容易混淆的概念,我们也会介绍两个概念的区别,这些都是本小节的重点,本小节的最后我们还会介绍 super 关键字以及 final 关键字。 1. 概念和特点 1.1 概念 继承是面向对象软件技术当中的一个概念。如果一个类别 B “继承自” 另一个类别