Java 基于UML图的结果?

Java 基于UML图的结果?,java,uml,Java,Uml,基于 以下哪个表达式有效 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

基于

以下哪个表达式有效

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
类的一个实例是否有一个与之关联的
numsets

我想说是这样的:

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
我遇到了麻烦,因为我认为在船类中,颜色是私有的,所以Kayak的实例没有与之关联的颜色。这是真的吗

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

此外,当船类是抽象的这一事实发挥作用时,它对皮艇有何影响


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

我想说是这样的:

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
我遇到了麻烦,因为我认为在船类中,颜色是私有的,所以Kayak的实例没有与之关联的颜色。这是真的吗

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

此外,当船类是抽象的这一事实发挥作用时,它对皮艇有何影响


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

这是纯粹的OOP,所以请花很多时间考虑它,直到您真正理解它为止

回答问题:

我遇到了麻烦,因为我认为在船类中,颜色是私有的,所以Kayak的实例没有与之关联的颜色。这是真的吗

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

此外,当船类是抽象的这一事实发挥作用时,它对皮艇有何影响

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

到目前为止,您的船类中还没有抽象方法。所以对于延伸(皮艇延伸船)来说,这并不重要,船是抽象的。事实上,在考虑示例表达式时,这很重要

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

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

Kayak类不是抽象的。因此,您可以从中创建实例。皮艇有很多座位。但是,正如你们可以有其他种类的船,它们并没有多少座位,你们不能说,所有的船都有很多座位

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


我想说的是,前两种方法行不通,因为船是抽象的。第三个和第四个将起作用,因为皮艇是一艘小船,所以可以使用皮艇参数将其设置为艇类,显然,皮艇是一艘皮艇。最后一个不会工作,因为没有这样的构造函数

这个答案是正确的,但我们应该研究一下你的措辞

因此,可以将其设置为具有Kayak参数的船级

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

Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1);
您正在创建一个Kayak实例,调用接受颜色、双精度和两个整数的Kayak构造函数(顺便说一下:这是唯一的构造函数)。然后将这个新Kayak实例的引用指定给变量boat3,它的类型是Boat。注意,我在这里讲的是类型,而不是类。正如我们前面提到的,皮艇是一艘船,这个任务是正确的

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


澄清一下:子类化只是指扩展类的技术过程。这也意味着继承超类的代码。亚型意味着是一种关系(皮艇就是船),是亚型多态性的关键。在Java中,子类化总是子类型化。

这是纯粹的OOP,所以请花很多时间来考虑它,直到您真正理解了这一点

回答问题:

我遇到了麻烦,因为我认为在船类中,颜色是私有的,所以Kayak的实例没有与之关联的颜色。这是真的吗

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

此外,当船类是抽象的这一事实发挥作用时,