類別的基本認識

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

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

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(){ }」來符合編譯器的規定。

物件的存取

在主程式中使用建立物件並使用的例子如下:
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」的用意是區別私有的參數,外界在存取時比較不容易發生問題。此時我們需要來瞭解存取層級。




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

想要從外部存取私有或受保護的資料,必須在類別中定義存取方法。要注意的是存取修飾子的層級,若希望能順利存取可參照上表賦予適合的修飾。
  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語言只允許單一繼承。




public class Wolf extends Dog{
 
 void eatPeople(int peoples) {
  
  for(int i = 0; i < peoples; i++) {
   
   System.out.println("yummy! ");
   
  }

 }

}

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

public class Fox extends Dog{
 



}

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

下一步 類別的進階認識

沒有留言:

張貼留言