引用的类型何时可以与其对象的类型不同?

时间:2014-05-25 05:46:54

标签: oop inheritance

昨天我在接受采访时被问到一个问题:

假设class A是基类,class B是派生类。

是否可以创建以下对象:

class B = new class A?
class A = new class B?

如果是,那么会发生什么?

3 个答案:

答案 0 :(得分:1)

类型B的对象也保证也是类型A的对象。这种类型的关系称为"Is-a,"或继承,而在OOP中,它是获取polymorphism的标准方法。例如,如果类型A的对象具有方法foo(),则类型B的对象也必须提供它,但允许其行为不同。

反向不是必然是真的:类型A的对象(基类)永远不会是类型B的对象(派生类)。即使它是,但在编译时也无法保证,所以第一行的结果是代码无法编译

第二行的作用取决于语言,但通常是

  • 使用基本类型的引用将限制您仅访问基本类型保证拥有的成员。
  • 在Java中,如果成员名称是"隐藏" (Ax存在,Bx也存在,但它们具有不同的值),当您尝试访问该成员时,您将获得与引用的类型相对应的值,而不是对象

第二个示例中的代码是标准做法,当您对API比其实现更感兴趣时,并希望尽可能使代码尽可能通用。例如,通常在Java中写一些像List<Integer> list = new ArrayList<Integer>()这样的东西。如果您决定稍后使用链接列表实现,则不必更改使用list的任何代码。

看看这个相关的问题:What does Base b2 = new Child(); signify?

答案 1 :(得分:0)

通常情况下,允许自动转换 down 层次结构,但 up 。也就是说,您可以自动将派生类转换为其基类,但不能反过来。所以只有你的第二个例子是可能的。 class A = new class B应该没问题,因为派生类 B 可以转换为基类 A 。但class B = new class A无法自动 ,但可以通过提供显式转换(重载构造函数)来实现。

答案 2 :(得分:0)

A是超类,B是SubClass / Derived Class 该声明 A类=新的B类总是可行的,它被称为Upcasting,因为你的上升程度更具体一般 例如:

Fruit类是基类,Apple类是派生的 我们可以认为Apple更具体,必须拥有水果的所有品质 所以你总是可以在哪里进行UPcasting

DownCasting并不总是可行的,因为Apple a = new Fruit();
水果可以是苹果,也可能不是