假设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-C
C#返回的信息B-C-C
。
对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。
C-C-C
而不是打印的逻辑是B-C-C
什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么?B-C-C
像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方法?C-C-C
?我的意思是,我该如何教导C#调用重写方法?用于虚函数定义:
虚拟函数或虚拟方法是一种功能或方法,其行为可以在继承类中被具有相同签名的函数覆盖。这个概念是面向对象编程(OOP)的多态性部分中非常重要的一部分。
在C#中,您应该将方法声明为virtual以便被覆盖,如MSDN中所示:
由于该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
方法更改B
为virtual
并在类中重写它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 “继承自” 另一个类别