Java

[Java] 2.封裝、Overloading、建構子

這篇要介紹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();
        }
    }

好 這篇就先到這邊 有了這些觀念 下一章的繼承就很簡單很簡單了

Be the First to comment.

Leave a Comment

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

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