基于
以下哪个表达式有效?
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
相关联?
答案 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中,子类化总是也是子类型。