Classes Lecturer: 曾學文
Outline Java IDE 開發環境平台簡介(Intellij IDEA) 回顧、練習 以新介面為基礎,正式介紹類別 類別(Classes) 成員變數(Member Variables) 成員方法(Member Methods) 建構元(Constructor) this 關鍵字 下一堂課:類別的繼承 下下堂課:類別的包裝 Your Turn
Java IDE 開發環境平台簡介(Intellij IDEA) JBuilder, JCreator, Intellij IDEA Intellij IDEA 號稱現今最聰明的 Java IDE 可以幫助你即時找到語法上的錯誤,(程式邏輯上的錯誤當然要靠自己發掘) 下載:http://www.jetbrains.com/idea/ 安裝 請打開各位電腦中的 Intellij IDEA
Intellij IDEA 取個project名、指定目錄 設定皆用預設值 new->Packge new->Class 寫個有main()的程式 執行
練習 如何寫出第一個程式 進一步 (參考上一堂課練習的答案 class.rar) Your Turn:設計一個Method 基本地使用 System.out.println 列印出相關訊息 進一步 (參考上一堂課練習的答案 class.rar) NUMBER, MATH, STRING 等物件的取用 迴圈 使用陣列 建立方法Method 方法Overloading Your Turn:設計一個Method draw(int width, int height); 參數為長、寬,用來畫圖 Hint: 巢狀迴圈加判斷式 DrawG(8,4); ******** * * * * ********
練習: 黃金比例、黃金分割 一條線分割成二段 1.618033989 Fibonacci數列當數字大到某一個程度 Your Turn: 短線段與長線段之比等於長線段與全部長度之比 (X+Y) :X=X : Y 此種比例在視覺上最為優美 1.618033989 Fibonacci數列當數字大到某一個程度 數列中任一個數字 / 前一個位置的數字 Your Turn: 用陣列存fibonacci數列 印出每一階段的X, Y比值 取到你覺得黃金比例數字出現的時候
類別 Classes 類別 簡單的說類別就是概念(觀念)。就拿動物來說明,正常的情況下,在這世界上動物有分水魚類、兩生類、爬蟲類、鳥類、哺乳類,而歸屬為鳥類的,世界上又有很多種,例如斑文鳥、大白鷺、五色鳥、冠羽畫眉(冠知目鳥)、黃尾鴝..等諸多鳥種。 類別名稱 ------------------------------------------------ .........屬性. ....屬性. ........屬性. ------------------------------------------------ ......行為.. ...行為...... .........行為....
類別 Classes 動物的類別 依 Java 的表示法 class Animal { 此列皆為動物的類別名稱. public int weight; 動物的屬性. public int height; public void eat(){....} 動物的行為 public void run(){....} }
類別 Classes 開創新的類別 Class MyClass { // 類別定義 /** * Class Body */ }
類別 Classes 成員 Members 建構子 Constructors 成員變數 (member variables) 方法 (member functions) 建構子 Constructors 建構元不是方法(method),也不是成員
本類別不能做為其他類別的 superclass 類別 Classes 宣告類別 主要部分 目的 public 公用類別,其他類別皆可存取本類別 abstract 本類別無法實體化 final 本類別不能做為其他類別的 superclass class 類別名稱 類別名稱 extends superclass 名稱 指定 superclass 名稱 implements 介面名稱 本類別必須實作『介面名稱』所指定的介面 { 類別主體 }
類別 Classes 宣告類別 public:若未宣告為 public,則只有同一個 package 裡的類別才可以使用本類別 abstract:抽象類別 final:不能被繼承 class 類別名稱 extends superclass 名稱:繼承了哪個父類別 implements 介面名稱:可以實作一個或多個介面
成員變數(Member Variables) 或稱為實體變數(instance variables) 資料型態可為基礎型態(primitive type)或參考型態(reference type) 每個物件皆各擁有一份自己的資料成員,不互相影響 基礎型態資料成員的初始值 資料成員之型態若為基礎資料型態,在未進行初始化的動作下,系統將自動將此變數初始化 系統初始化僅針對物件中的資料成員;區域變數沒有此行為 養成初始化的好習慣!
成員變數(Member Variables) 簡單的 Box 類別 /** * 簡單的類別,只有三個實體變數 */ class Box { double width; double height; double depth; } //建立一個稱為mybox的Box物件。 Box mybox = new Box(); 點 (.) 運算子 mybox.width = 100;
成員變數(Member Variables) Example: BoxDemo.java class BoxDemo { public static void main (String args []) { Box mybox = new Box ( ); double vol; mybox.width = 10; mybox.height = 20; mybox.depth = 15; vol = mybox.width*mybox.height*mybox.depth; System.out.println(“Volume: " + vol); } }
成員方法(Member Methods) 定義 methods public Object push (Object item) 存取等級 static 宣告本 method 為 class method abstract 宣告本 method 內不需任何程式碼 final 宣告本 method 不允許被 subclass 覆蓋(override) native 宣告本 method 為其他程式語言所寫成 synchronized 必須由 monitor 來控制執行時機 (參數列) 參數列 throws 異常事件 宣告本 method 丟出的例外(exceptions)
成員方法(Member Methods) 在 Java 語言中,方法只能在類別中被創造 方法的呼叫 透過物件呼叫(instance methods) 必須使用正確的方法名稱、參數個數與型態 如 str.substring() 透過類別呼叫(static methods or class methods) 如:Math.power()
成員方法(Member Methods) 為 method 命名,一般命名習慣 將資料傳入method – 參數 應該採用英文動詞,可以串接多個單字:整個字串的第一個字母小寫,其他串接單字的第一個字母大寫 如: toString(), compareTo(), setX(), getX()… Method 名稱不能和 class 名稱一樣,因 class 名稱保留給建構元使用 將資料傳入method – 參數 只要是合法的 Java 資料型態,都可以傳入 method 中 如:double, float 與 int,或是物件 Java 中不允許將 methods 當成參數,傳入另一個 method 中
成員方法(Member Methods) 在 Java 中有三種情況可能會造成 method 在類別中或是 superclass 中和其他的 methods 同名 覆蓋 methods(overriding methods) 遮蔽 methods(hiding methods) 名稱過載(name overloading)
成員方法(Member Methods) Overloading Java 中,以 method 的名稱與參數來決定一個 method 因此,Java 允許多個 methods 共用同一個名字,但必須擁有不同數目或型態的參數以供區分 例:class Data { void draw() { … } void draw(int x, int y) { … } }
成員方法(Member Methods) 為 Box 類別加入方法 class Box { double width; double height; double depth; void showVolume(){ System.out.println(“volume: ” + width*height*depth); } void setBoxColor(String color){ boxColor = color; } void showBoxColor(){ System.out.print("Color:"); System.out.println(boxColor);
成員方法(Member Methods) Example: BoxDemo.java Box mybox1 = new Box(); // 產生一個 Box 物件變數 mybox1 Box mybox2 = new Box(); // 產生一個 Box 物件變數 mybox2 mybox1.width = 10; mybox1.height = 20; mybox1.depth = 15; mybox2.width = 21; mybox2.height = 22; mybox2.depth = 23; mybox1.showVolume(); mybox2.showVolume();
建構元(Constructors) Constructors 類別都擁有 constructor 來初始化此類別物件 constructor 必與類別同名,且沒有回傳值,也不需要指定回傳型態,不可使用 void 建立類別時,若沒有自訂的 constructor ,此時 Java compiler 將為此類別自動提供預設的 constructor;若已有自訂的 constructor,系統將不再提供預設的 constructor constructor 與一般函式一樣,可以擁有許多參數,也可以沒有參數 例:class Cat { Cat(int x) { statements… } // Constructor }
建構元(Constructors) 多個建構元 可以利用 Overloading 的技術來達成 一個類別可以用有許多 constructors,所有 constructors 都必須與類別同名,但擁有不同的參數 Java 編譯器依照呼叫 constructor 時所傳入的參數數目來判斷所呼叫的 constructor 例:class Cat { Cat() { … } // 建構元一 Cat(int x) { … } // 建構元二 Cat(String color) { … } // 建構元三 }
建構元(Constructors) 修飾建構元的關鍵字 private 如果一個類別裡所有的建構元都是宣告成 private 的話,那這個類別應該會有 public 的類別方法(class method),讓其他類別建立此類別之物件 protected 只有該類別的 subclass,或是屬同一個 package 裡的類別,才可以使用此建構元 public 所有類別都可以使用此建構元 預設 只有同一個 package 裡的類別,才能使用此建構元
建構元(Constructors) 具有建構元的 Box 類別 class Box { double width; double height; double depth; //這是Box的建構元。 Box() { width = 1; height = 2; depth = 3; } //顯示盒子體積 void showVolume() { System.out.println("Box Volume:" + (width*height*depth)); }
建構元(Constructors) Example: BoxDemo.java //宣告、配置與初始化Box物件 Box mybox1 = new Box(); Box mybox2 = new Box(); //第一個盒子的體積 myBox1.showVolume(); //第二個盒子的體積 myBox2.showVolume();
this 關鍵字 this 關鍵字:用來存取目前的物件 通常在 instance method 或建構元(constructor)內使用 this,可以呼叫目前物件的任何成員。 原因:成員變數被 method 或是建構元內的同名參數給『遮蔽』了 常使用在 constructor 裡,當參數與成員變數名稱相同時 在 method 裡使用 this 的目的,是為了要避免成員變數與參數之間的混用(ambiguity),尤其當參數名稱與成員變數名稱相同時 this 也可用來呼叫此物件的 methods this 也可以用來呼叫此物件的 constructor
this 關鍵字 可以透過 this,呼叫相同類別底下的另一個建構元 public class AClass { private int x, y; private int width, height; public AClass(){ this(0,0,0,0); } public AClass(int width, int height){ this(0,0,width,height); public AClass(int x, int y, int width, int height){ this.x = x; this.y = y; this.width = width; this.height = height; ...
this 關鍵字 具有二個建構元的 Box 類別 class Box { double width, height, depth; // 預設的建構元 Box() { this(1, 2, 3); } // 可以自行指定長寬的建構元 Box(int width, int height, int depth){ this.width = width; this.height = height; this.depth = depth;
this 關鍵字 Example: BoxDemo.java class BoxDemo { public static void main (String args []) { //宣告、配置與初始化Box物件 Box myBox1 = new Box(); Box myBox2 = new Box(10, 20, 30); double vol1, vol2; //顯示第一個盒子的體積 myBox1.showVolume(); //獲得第二個盒子的體積 myBox2.showVolume(); }
Your Turn 建立一個 Rectangle 類別 此類別必須完成下列要求 建構元 顯示目前的長、寬之值 取得目前矩形之面積 初始化預設長、寬各為 8、4 可自行設定矩形之長與寬 可以複製相同物件的建構元(傳進去的參數為要copy的物件) 顯示目前的長、寬之值 取得目前矩形之面積 畫矩形,由 * 構成邊長 在 RectangleDemo 類別下,寫個 main() 來測試所有功能
Your Turn Hint class Rectangle { final int DEFAULT_LENGTH = 8; final int DEFAULT_WIDTH = 4; private int length; private int width; Rectangle(){ … } Rectangle(int length, int width){ … } Rectangle(Rectangle obj){ … } void showLW(){ … } double getArea(){ … } void drawRect(){ … } public static void main(String[] args){ … } }
Your Turn 試著利用 Intellij IDEA 寫一個簡易使用者介面來測試你剛剛所寫的 Rectangle 類別的各項功能 1. 顯示長寬 2. 得到面積 3. 畫出矩形 4. 離開 Hint: 巢狀迴圈加判斷式 ******** * * * * ********