類別的基本認識

世上所有的人、事、時、地、物都可視為物件,都是能導入程式設計的。「物件導向程式設計」則是根據程式需求,建立相對應的物件及方法。目前我們所熟悉的「類別」定義事物的抽象特點,定義了事物的屬性和它可以做到的。類別可以重複建立物件,每個物件都有源自類別的屬性和方法可以直接存取。源自類別的新物件也可以建立有新的屬性和方法,一但有物件參照也就成為新類別。舉例來說,「狗」這個類別會提供狗的一切基礎特徵,例如它的身長、體重、顏色和吠叫的能力。依據「狗」的特質,可能產生「狼」或「狐貍」科目類屬種。

「物件」與「類別」這兩個個詞,其實是同義詞。將概念作為認知的對象時稱為類別,由類別所產出的個體即為物件。這些概念因為會牽涉到每個人對於觀點、角度等認知,有時候可能會有不同的見解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Dog {
  
 int height; //身高
  
 int weight; //體重
  
 String color; //顏色
  
 //建立方式
 dog(){
   
   
 }
  
 //帶參數的建立方式
 Dog(int height, int weight, String color){
   
  this.height=height;
   
  this.weight=weight;
   
  this.color=color;
   
 }
  
 void bark(String str) { //叫的方法
   
  System.out.println(str);
   
 }
  
 void eat(int food) {
   
  for(int i = 0; i < food; i++;){
 
  }
   
 }
 
}


「this」用於區分類別變數名稱與方法內的變數名稱,帶有「this」的變數就是指明此變數為類別的變數名稱。
有1個或1個以上的帶參數建立方式時,才需要「dog(){ }」來符合編譯器的規定。

物件的存取

在主程式中使用建立物件並使用的例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CH01401 {
 
 public static void main(String[] args) {
   
  Dog Lucky=new Dog();
   
  Lucky.weight=7500f;
   
  Lucky.height=120.5f;
   
  Lucky.color="snow";
   
  Lucky.bark("bow!");
   
  //
  Dog Puppy = new Dog(6300, 100, "gray");
   
  Puppy.bark("woof!");
 
 }
 
}


dog( ){ } 和
Dog(float height, float weight, String color)
上面2個敘述都可以用於建立「dog」,差別在於是建立時是否帶參數。沒有帶參數的建立方式視情況可能要有「=」的方式存取內容,帶有參數的建立方式則有可能建立「dog」的部份屬性。


公有或私有

將原有的變數名稱前加上「private」會使得原有的程式碼出現編譯錯誤。「private」的用意是區別私有的參數,外界在存取時比較不容易發生問題。此時我們需要來瞭解存取層級。




1
2
3
4
5
6
7
private int height; // 身高是狗的隠私
   
private int weight; // 體重是狗的隠私
   
private String color; // 顏色是狗的隠私
 
public void bark(String str) // 狗一定會叫所以不是隱私

將「Dog」做出以上的修改會發現範例程式出現編譯錯誤,問題出在不同的存取層級的存取權限。
這些問題只要以日常生活看待設計者的思絡,規則只有3種請參照下表:。

修飾子名稱 同一類別 同一套件 不同套件的子類別 不同套件的非子類別
private OK


空白 OK OK

protected OK OK OK
public OK OK OK OK

想要從外部存取私有或受保護的資料,必須在類別中定義存取方法。要注意的是存取修飾子的層級,若希望能順利存取可參照上表賦予適合的修飾。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int getHeight() {
 return height;
}
 
public void setHeight(int height) {
 this.height = height;
}
 
public int getWeight() {
 return weight;
}
 
public void setWeight(int weight) {
 this.weight = weight;
}
 
public String getColor() {
 return color;
}
 
public void setColor(String color) {
 this.color = color;
}

set and get 方法在eclipse中可以自動完成
在程式碼區右鍵或是功能表列找到 source
source → generate getters and setters 選取名稱後就會自動產生程式碼


繼承

在建立新類別的時在類別後方增加關鍵字「extends 類別名稱」該類別的所有屬性和方法都隨著建立並立刻可以使用。這使得類別物件的資源可以延伸和重複使用,在程式中也可將「extends」來實作延伸多類別關係。繼承關係實際若沒有嚴謹的設計容易發生問題,為了避免多重繼承的不確定性與複雜性JAVA語言只允許單一繼承。




1
2
3
4
5
6
7
8
9
10
11
12
13
public class Wolf extends Dog{
  
 void eatPeople(int peoples) {
   
  for(int i = 0; i < peoples; i++) {
    
   System.out.println("yummy! ");
    
  }
 
 }
 
}

使用關鍵字extends來表達繼承觀念,繼承後類別物件的資源可以延伸和重複使用,在程式中可以利用 extends 來實作繼承關係。

1
2
3
4
5
6
public class Fox extends Dog{
  
 
 
 
}

請用狗類別創建出狐狸,並且參照狼類別賦予狐貍的基本能力。

下一步 類別的進階認識

沒有留言:

張貼留言