我的老师最近给出了关于java的练习考试,我很想知道我是如何对真/假部分做的。我对第一名最不自信,所以任何解释都会有所帮助。
在Java中,一个类可以扩展任意数量的抽象类。
假。我不太明白为什么,这只是因为在继承类中,父类可能会导致冲突吗?
在Java中,传递类型为抽象类的参数是非法的。
错误,抽象类甚至没有构造函数......
在Java中,抽象类可以包含任意数量的子类。
真。我想不出任何会限制这种情况的事情。
在Java中,对类可以实现的接口数量没有限制。
是的
无法将堆栈实现为双向链接列表,因为堆栈只需要访问列表的一端,而双向链接列表则可以访问列表的两端。 / p>
真。但效率不高。
答案 0 :(得分:7)
1)它是错误的,因为Java不支持多重继承。一个类只能扩展一个类,无论它是否为抽象类。它可以传递地扩展多个类(例如,它扩展了B,它扩展了C,因此间接地扩展了C)。一个类可以实现多个接口。 Java不支持多重继承的原因有很多,但它确实支持多个接口,所以它在很多方面都更好。
2)首先,抽象类可以有构造函数。声明是错误的,因为您可以将抽象类型作为参数传递。由于多态性,您将传递已实例化的具体子类型。
3)这是真的
4)这在某种程度上是正确的(JVM实现存在一些限制,但在实践中你永远不会遇到它)
5)您可以轻松地将堆栈实现为双向链表,这是一个很好的练习。它甚至是高效的,因为你仍然在O(1)做所有事情。
答案 1 :(得分:3)
1)正确。 Java(比如C#)拒绝了多次实现继承,主要是出于复杂性的原因,我相信。
2)半正确:实际答案是对的(假;你当然可以声明抽象类的参数,变量等),但你的推理是错误的(我怀疑你的意思是“真的”这本来是完全错误的)。抽象类可以具有由派生类调用的构造函数。除此之外,构造函数与参数类型是否可以是抽象类有些无关。
3)正确。
4)正确。
5)嗯,你错了 可能(而你声称它确实不可能)。 实现可以访问列表两端的事实并不意味着它必须公开两端。
答案 2 :(得分:1)
abstract A
- > abstract B
- > C
。答案 3 :(得分:1)
1)是假的,因为在Java中“extends”是一个特定的操作,它继承了所有数据结构和所有方法的实现。在Java中,类只能扩展一个超类。但是,在Java中,您可以实现任意数量的接口,它们只会“引入”您必须实现的函数的名称和签名。
原因是扩展的多个基类 - 称为“多重继承” - 被认为是令人困惑的。这是一个宗教战争问题; C ++执行多重继承,而Java和Smalltalk则不然,而Ruby则允许您将模块混合到与多重继承相同的效果。
2)您可以将某些内容作为抽象类传递。例如,考虑一个抽象类Shape,具有圆形,方形和三角形的具体子类。所有这些都是“种类”的形状,所以你可以将一个Shape传递给任何适用于全部的操作。
3)唯一的重建是你可以让一个类最终,这可以防止它进入子类。使抽象类最终成功是没有意义的;你永远无法使用它。
4)是的,这就是你如何摆脱需要扩展多个类的问题;接口就是你获得多重继承的方式。
5)将堆栈实现为双向链接列表肯定是可能。更重要的是,在你想要的某些情况下。例如,考虑一下你希望能够在不打扰整个堆栈的情况下显示整个堆栈的东西。然后,使用非破坏性的“全部显示”操作扩展该堆栈是有用的。在链接列表上实现的堆栈中,您可以“遍历”整个列表,然后“将其”移回头部。
答案 4 :(得分:0)
1:这是错误的,因为在Java中你根本无法扩展多个类。
2:我认为你错了:抽象类可以有一个构造函数!
3:是的,你是对的。抽象类甚至不知道它是否有子类。
4:是的,你是对的,只有理论上的限制(计算机上的任何内容都不受限制)。
5:我认为你错过了这个问题:如果你有一个Double-Linked-List,你实际上可以接受它并从中制作一个Stack 。在List中,您可以获取第一个元素,以便您可以使用此方法来实现堆栈