再談資料繼承
先前提到基於封裝性 (encapsulation)最好將資料成員 (屬性) 設定為private,而由成員方法管控資料成員的存取權。在介紹繼承時,也指出宣告為private之成員方法只有自身類別可以使用,那麼子類別會不會繼承父類別的private資料成員?
其實子類別內還是存在著來自父類別的private資料成員,只是不允許直接使用這些資料成員,除非父類別有提供方法來存取這些private資料成員。檢視下列程式碼中,BALL類別的radius資料成員是private性質,BASKETBALL類別繼承BALL類別,自然還是具備radius屬性,只是不能直接取用,因此程式碼第15行作法是不被允許的;但BASKETBALL類別仍可透過繼承自BALL類別的getRadius()方法來取得radius值 (如程式碼第16行)。從現實生活的角度來看,籃球既然繼承球類別,隱含具備半徑屬性是合理的。
1. public class BALL {
2. private float radius;
3. public BALL (float r) {
4. this.radius = r;
5. }
6. public float getRadius() {
7. return radius;
8. }
9. }
10. public class BASKETBALL extends BALL {
11. BASKETBALL (float r) {
12. super(r);
13. }
14. public void showinfo() {
15. System.out.println(this.radius); //錯誤
16. System.out.println(this.getRadius()); //正確
17. }
18. }