這是純粹的面向對象,那麼請花太多時間去想它,直到你真的理解了這一點。
回答問題:
我有麻煩,因爲我認爲既然在船類,顏色是私人所以皮艇的實例沒有與其相關聯的顏色。這是真的?
不,這是錯誤的。根據UML,船有顏色。這個「財產」可以通過獲取者getColor
和設定者setColor
來看到。私人領域只是一個實施細節,這並不重要。正如Kayak延伸(派生自)船,可以說,皮划艇是一艘船。這就是所謂的分型。此外,Kayak繼承了Boat的代碼,因此也繼承了屬性的顏色。所以皮划艇也有一種顏色。
此外,船類是抽象的事實發揮作用,它如何影響皮划艇?
當擴展它時,超類是否抽象並不重要。重要的是:如果你的超類是抽象的和包含抽象方法,而你的子類不是抽象的,那麼你的子類必須提供抽象方法的實現。
到目前爲止,您的Boat類中沒有抽象方法。所以對於延伸(皮艇延伸船)沒關係,船是抽象的。實際上,在考慮示例表達式時很重要。
最後,一個Boat類的實例是否有一個與它關聯的numSeats?
這個問題包含一個錯誤:不能有船類的instancs。僅僅因爲船類是抽象的。你不能創建抽象類的實例!
皮劃分類不是抽象的。因此您可以從中創建實例。皮艇實例有許多座位。但是,正如你可以讓其他班級擴展船隻那樣,沒有座位數量,你不能說所有的船隻都有一定數量的座位。
順便說一句:你能回答這個問題,哪些表達式是有效的?你能發表你的答案和理由嗎?
我想說前兩個將不起作用,因爲船是抽象的。第三和第四將工作,因爲皮划艇是一艘船,所以它可以設置爲具有獨木舟參數的船類,顯然皮划艇是皮划艇。最後一個不會工作,因爲沒有這樣的構造函數。
這個答案是正確的,但我們應該在你的措辭上工作。
,因此它可以與獨木舟小船類參數
皮艇不能「被設置爲船類」進行設置。讓我們考慮表達
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1);
您正在創建一個實例皮艇,調用Kayak的構造函數,顏色,雙,和兩個整數(順便說一句:這是唯一的構造函數)。然後,您將這個新的Kayak實例的引用分配給變量boat3,該變量是Boat類型的。請注意,我說的是這裏的類型,而不是類。正如我們之前提到的,皮划艇是一艘船,這項任務是正確的。
這個OOP概念被稱爲子類型多態性:一個類型爲Boat的變量可以引用任何船隻,所以它也是子類型。 (在這種情況下,它必須是子類型,因爲船是抽象的)
只是爲了澄清措辭:子類只是指擴展類的技術過程。這也意味着繼承超類的代碼。子類型意味着是一種關係(皮划艇是船),並且是亞型多態性的關鍵。在Java中,子類化總是也是子類型的。
它說什麼船是抽象的? – BevynQ
船類是斜體 - 抽象的象徵。 – user3089390