這篇要介紹java物件導向的基礎觀念
講到這邊就會想到老闆很愛問 物件導向的三大要素
封裝(Encapsulation) 繼承(Inheritance) 多型(Polymorphism)
在了解這個之前 我們先來一個簡單的範例 先了解一下該怎麼使用物件
1 2 3 4 5 6 7 8 9 10 | class car { //這邊會宣告一些car的屬性之類的 } public class Buildcar{ public static void main(String[] args) { car oldcar = new car(); car newcar = new car(); } } |
這邊一看大概就會知道 我創了兩個物件 oldcar newcar 然後他們都是參考car這個class 也就是說 他們的所有的內容 car這個class怎麼定義 這兩個物件就是怎麼定義
這時候class就可以開始定義一些規則 給那兩台新舊車用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class car { String color; //開規格 String price; void printstatus () { System.out.println( "這台車為" +color); System.out.println( "售價為:" +color); } } public class Test1_OneDimArray{ public static void main(String[] args) { car oldcar = new car(); car newcar = new car(); oldcar.color= "黃色" ; oldcar.price= "30萬" ; newcar.color= "黑色" ; newcar.price= "100萬" ; oldcar.printstatus(); newcar.printstatus(); } } |
在裡面你可以發現 我的car類別(class)開了兩個規格color 跟price
所以當我去new了一台car之後 我就可以參照他的規格來給資料了 oldcar.color
這時候你會發現5~8行 有一個void printstatus這個東西 他感覺有點類似function的東西 它叫做 方法(method)
通常 在一個class裡面 我們會把一些變數規格開在最上面 例如你看到的String color 然後 我們開了一個class 總是會想要他來做點事情吧
例如一些條件判斷阿之類的 這時候我們就會開一個很像function的 方法 來處理這些事情 這樣我們只要呼叫這個方法就可以了
這個方法很好用 也很重要(包刮後面會講到的over loading ridding都是它的應用)
如上面所說的 既然他可以運算 總是要傳點東西回來給我吧? 我才知道算得怎樣啊
所以這邊就來一個 傳回值的範例
1 2 3 4 5 6 7 | String howprice(String price) { if (price== "30萬" ) output= "低價車" ; if (price== "100萬" ) output= "高價車" ; return output; } |
你看到了有一個return的傳回值
這時候你要是用oldcar.howprice(price) 你就可以得到一個 “低價車”的字串了
而在這邊 你可能沒想到一個問題 就是變數的有效範圍
我在class裡面宣告一個 String color 這個color的變數 在整個class裡面都會有效 甚至在她的方法(method)裡面都一樣有效
只要離開了這個class 就無效了
講到這邊 先休息一下 了解了method的使用後 就可以開始介紹over loading了
over loading 定義同名方法
在寫程式的時候 總是會遇到類似意義的動作 但是需要的值卻不一樣
例如我想一個計算面積的method
1 2 | int area( int height, int weight){ //長方形面積 return height* weight} |
這可以計算矩形面積
阿圓形哩 三角形勒 要是你沒學過over loading 你一定會創一大堆類似 tri_area的方法拉 orange_area的方法拉(?)
然後又要再去判斷他是哪種型 就叫他去跑哪個方法…..$%$^#%
現在 有了over loading 就好像有了大補帖一般 通通幫你整合在一起!
怎麼說呢
1 2 3 4 5 6 7 8 9 10 11 12 | //圓形面積 public static double area( int radius){ return radius* radius* 3.14 ; } //長方形面積 public static double area( int height, int width){ return height*width; } //梯形面積 public static double area( int upper, int bottom, int height){ return (upper+bottom)*height/ 2 ; } |
名字通通都叫做area 就看你傳幾個變數給我 我就拿哪個方法去吃
這樣是不是簡單多了? 我只要需要計算面積 我通通都叫area去吃就好 反正生命會自己找到出路的
而這邊要注意的是 overloading無法根據傳回值的型態不同來區分 例如
void method(int i)
int method(int j) //這兩個重複宣告
String method(int k) //這兩個重複宣告
建構子
而 甚麼叫做建構子呢
跟class同名的method 就叫做建構子! 建構子 沒有回傳值(return) 有return就變成一般的method了
而建構子要幹嘛的 其實我目前還不太知道 就暫時把它當作方法用吧….
而我們可以利用 this 這個東西 來呼叫 同名的建構子(也就是可以用this 來呼叫overloading的method)
1 2 3 4 5 6 7 8 9 10 11 12 | public int no; public String name; public employee ( int no ,String name){ this .no = no; this .name = name; } public employee ( int no){ this .employee (no , "不知道" ); } public employee (String name){ this .employee ( 0 ,name); } |
可以看到第七行的建構子裡面有用this.employee 去呼叫 擁有兩個變數輸入的建構子(就是第三行的建構子)
好 看到這邊 其實 我還沒說 你已經有 封裝(Encapsulation) 的概念了
怎麼說呢 我們已經開始會把相同的東西都放在同一個class裡面
例如class car 這個class裡面都會放car的東西 class member 就都會放會員相關的東西
這就是封裝的概念 只是我們還沒”封”起來而已
所謂封裝(Encapsulation),是指class A的設計者可以指定其他的class能否存取A的某個member。
所以我們要資料都只要用newcar.color 就可以得到newcar.color=”黑色”;
這樣其實很糟糕阿 我的class裡面一堆祕密的變數人家都可以這樣隨便存取
所以我只要用private 這樣別人就不能存取”變數”了 只能透過 方法(method) 來得到資料就變成以下這樣 我們做一個getcolor()的方法 來讓他們存取我決定可以讓他們讀取的資料 其他的都不能存取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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(); } } |
好 這篇就先到這邊 有了這些觀念 下一章的繼承就很簡單很簡單了