Java

[Java] 3.繼承、Overriding

這邊講到繼承 在看繼承之前 我們先來一段 上一篇

[JAVA] 2.封裝、Overloading、建構子
有出現的程式碼

class car {
   String color; //開規格
   String price;

   void getcolor() {
      return color;
   }
 }

 public class Test1_OneDimArray{
    public static void main(String[] args) {
        car newcar = new car();

        newcar.color="黑色";
        newcar.getcolor();
    }
 }

就是一段我創了一個class car的程式碼 然後可以得到他的顏色這樣

好 那假設我現在汽車工業想來做機車 我也創了一個class autocar
之後勒? 當然car 部門有啥鬼東西 我autocar部門也就照單全抄嘛,然後你就會發現兩個class裡面東西都一樣 這樣不是很浪費程式空間嗎?

所以這時候我就給你了一個extend的東西,叫做繼承
這東西怎麼用呢?超簡單! 一行解決!

class autocar extend car{
//空空的
}

結束了! 我創了一個autocar的部門 然後告訴他(用extend)我這部門全部跟car一樣
我裡面一行字都不用寫,我全部都跟人家一樣了,人家有甚麼我就有甚麼
人家沒有甚麼,我下面再自己寫嘛! 程式概念就等同於你一看到extend xxx
你就把xxx裡面所有的(包含變數、方法) 全部都複製到我的class裡面一樣。

所以這樣我就可以new一個autocar的class卻使用car的方法。

而上一篇文章有講到 呼叫自己class裡面同名的方法要用this(xx,xxx,xx)的方式來呼叫,

而我現在繼承了,我如果要呼叫父類別(就是你繼承的那個class car)裡面的方法呢?

這時候就是變成改用super(xxx,xxx,xx)

super可以呼叫父類別的方法,所以也包含了建構子。(註:super一定要放在敘述的第一行,且建構子要是沒寫super其實java會自動放一個隱藏的super()在前面只是沒給你看到而已)

而如果我不想用父類別的方法,我想自己寫 但是又想要用父類別的變數,就要記得注意父類別的變數設定(public private..這四種),你父類別不想要給你繼承這個變數,不給你看你也沒辦法。

Java定義了四種存取範圍:

  • private:只有A自己才可以存取, 使用keyword private
  • package:只有和A同一個package的class才可以存取, 沒有相對應的keyword
  • protected:只有同一個package或是A的子類別才可以存取, 使用protected
  • public:所有的class都可以存取, 使用public

我們一開始都用public  而父類別可能會為了保護變數 而改用了private 這樣你就讀不到了

你要叫父類別改成package以上的權限

所以你看了就會發現public >  protected  >  package  >  private

回來我們汽車工業 我autocar部門繼承了car部門後 用阿用 突然發現 汽車部門的方法怎這麼爛,根本就不合我需求阿 我乾脆 自己來寫一個好了。

這時候怎辦? 方法的名字car部門都用去了,我總不能再搞個啥color1這種鬼方法出來吧?

這時候你就只會想,我乾脆直接把你蓋掉就好啦,我自己寫一個跟你同名的方法 把˙你˙蓋˙掉

於是乎 你莫名其妙的 你就會overriding了 overriding就是為了這時候誕生的(看2 3跟8 9行)


class parent {
 void show() {
    System.out.print("我是父類別");
 }
}

class child extends parent {
 void show() {
    System.out.print("我是子類別");
 }

}

public class overriding {
 public static void main(String[] args) {
     child c = new child();
     c.show();
 }
}

懂了嗎,就是寫一個跟父類別一模一樣的方法 就是overriding了,也就是覆蓋的意思

這邊要注意的是overriding的方法名稱、參數個數、參數型別、回傳值都要一樣,如果不一樣就會變成一個新的方法了而不會覆蓋,而繼承的時候 你的存取控制不能比父類別的小,權限要開的更大或一樣才行(就是假設父類別開protected  你就只能也開protected  或public 不能把它變成private之類的)

Be the First to comment.

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)