這篇要介紹java物件導向的基礎觀念
講到這邊就會想到老闆很愛問 物件導向的三大要素
封裝(Encapsulation) 繼承(Inheritance) 多型(Polymorphism)
在了解這個之前 我們先來一個簡單的範例 先了解一下該怎麼使用物件
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就可以開始定義一些規則 給那兩台新舊車用
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都是它的應用)
如上面所說的 既然他可以運算 總是要傳點東西回來給我吧? 我才知道算得怎樣啊
所以這邊就來一個 傳回值的範例
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
int area(int height,int weight){ //長方形面積 return height* weight}
這可以計算矩形面積
阿圓形哩 三角形勒 要是你沒學過over loading 你一定會創一大堆類似 tri_area的方法拉 orange_area的方法拉(?)
然後又要再去判斷他是哪種型 就叫他去跑哪個方法…..$%$^#%
現在 有了over loading 就好像有了大補帖一般 通通幫你整合在一起!
怎麼說呢
//圓形面積 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)
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()的方法 來讓他們存取我決定可以讓他們讀取的資料 其他的都不能存取
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(); } }
好 這篇就先到這邊 有了這些觀念 下一章的繼承就很簡單很簡單了