這邊講到繼承 在看繼承之前 我們先來一段 上一篇
[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定義了四種存取範圍:
我們一開始都用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之類的)