昨天我在接受采访时被问到一个问题:
假设class A
是基类,class B
是派生类。
是否可以创建以下对象:
class B = new class A?
class A = new class B?
如果是,那么会发生什么?
答案 0 :(得分:1)
类型B的对象也保证也是类型A的对象。这种类型的关系称为"Is-a,"或继承,而在OOP中,它是获取polymorphism的标准方法。例如,如果类型A的对象具有方法foo()
,则类型B的对象也必须提供它,但允许其行为不同。
反向不是必然是真的:类型A的对象(基类)永远不会是类型B的对象(派生类)。即使它是,但在编译时也无法保证,所以第一行的结果是代码无法编译。
第二行的作用取决于语言,但通常是
第二个示例中的代码是标准做法,当您对API比其实现更感兴趣时,并希望尽可能使代码尽可能通用。例如,通常在Java中写一些像List<Integer> list = new ArrayList<Integer>()
这样的东西。如果您决定稍后使用链接列表实现,则不必更改使用list
的任何代码。
答案 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();
水果可以是苹果,也可能不是