结果基于UML图?

时间:2013-12-20 07:06:02

标签: java uml

基于 this UML diagram

以下哪个表达式有效?

Boat boat1 = new Boat();
Boat boat2 = new Boat(Color.black, 300.2);
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1);
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1);
Kayak kayak2 = new Kayak();

我遇到了麻烦,因为我认为因为在Boat课程中,Color是私有的,所以Kayak的实例没有与color相关联它。这是真的吗?

此外,Boat类是抽象的事实发挥作用,它如何影响Kayak

最后,Boat类的实例是否与numSeats相关联?

3 个答案:

答案 0 :(得分:2)

唯一可行的两个构造函数是:

Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); 
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1); 

如果在构造函数中对Boat构造函数进行超级调用,则Kayak将具有与之关联的颜色。

  

此外,Boat类是抽象的事实   玩,它对Kayak有何影响?

无论如何。这只是意味着你无法创建一个船的实例。

  

最后,Boat类的实例是否与numSeats相关联   用它?

没有。一艘船对numSeats一无所知。这是一个抽象的概念。它可以是冲浪板,也可以是远洋客轮。

答案 1 :(得分:1)

我会说是这样的:

Boat boat1 = new Boat(); // doesn't work, Boat is abstract
Boat boat2 = new Boat(Color.black, 300.2);// doesn't work, Boat is abstract
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); // ok
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1); // ok
Kayak kayak2 = new Kayak(); // No such constructor
  

我遇到了麻烦,因为我觉得因为在Boat类中,Color是私有的,所以Kayak的一个实例没有与之相关的颜色。这是真的吗?

不是,Kayak接受Color作为参数,因此可以将其传递给Boat构造函数

  

此外,在Boat类抽象的事实发挥作用的情况下,它如何影响Kayak?

不,可以从抽象类派生,然后将其用作参考基础(即Boat x = new Kayak

答案 2 :(得分:1)

这是纯粹的OOP,所以请花些大量时间考虑一下,直到你真正明白这一点。

回答问题:

  

我遇到了麻烦,因为我觉得因为在Boat类中,Color是私有的,所以Kayak的一个实例没有与之相关的颜色。这是真的吗?

不,这是错的。根据UML,船有颜色。 getter getColor和setter setColor可以看到此“属性”。私有字段只是一个实现细节,无关紧要。正如Kayak延伸(派生自)船,可以说,Kayak 船。这称为子类型。此外,Kayak继承了Boat的代码,因此也继承了属性颜色。所以,皮划艇也有颜色。

  

此外,在Boat类抽象的事实发挥作用的情况下,它如何影响Kayak?

在扩展它时,超类是否是抽象的并不重要。重要的是:如果你的超类是抽象的并且包含抽象方法而你的子类不是抽象的,那么你的子类必须提供抽象方法的实现。

到目前为止,您的Boat课程中没有抽象方法。所以对于扩展(Kayak扩展船)来说无关紧要,那艘船是抽象的。事实上,在考虑示例表达式时这很重要。

  

最后,Boat类的实例是否有与之关联的numSeats?

这个问题包含一个错误:没有船级的实例。仅仅因为Boat类是抽象的。你不能创建抽象类的实例!

Kayak课程不是抽象的。因此,您可以从中创建实例。皮划艇实例有多个席位。但是,正如你可能有其他课程延伸船,没有座位数,你不能说,所有船只将有多个席位。

顺便问一下:你能回答这个问题,哪些表达方式有效?你能发布你的答案和理由吗?

  

我想说前两个不会起作用,因为船是抽象的。第三个和第四个将起作用,因为Kayak IS A Boat,所以它可以被设置为具有Kayak参数的Boat类,并且显然Kayak是Kayak。最后一个不起作用,因为没有这样的构造函数。

这个答案是正确的,但我们应该按照你的措辞进行处理。

  

因此可以将其设置为具有Kayak参数的Boat类

皮划艇不能“被设为船级”。我们考虑一下表达式

Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1);

您正在创建一个Kayak实例,调用Kayak构造函数,该构造函数接受Color,double和两个整数(顺便说一下:这是唯一的构造函数)。然后,您将此新Kayak实例的引用分配给变量boat3,其类型为Boat。请注意,我在这里说的是类型,而不是类。正如我们之前提到的,皮划艇是一艘船,这项任务是正确的。

这个OOP概念被称为子类型多态性:Boat类型的变量可以引用任何Boat,因此它也是它的子类型。 (在这种情况下,它必须是子类型,因为Boat是抽象的)

只是为了澄清措辞:子类化仅仅意味着扩展课程的技术过程。这也意味着继承超类的代码。子类型意味着is-a-relationship(Kayak是一艘船),并且是子类型多态性的关键。在Java中,子类化总是也是子类型。