240 likes | 553 Views
Java 物件導向程式設計. 物件參照 陣列 Overloading 過載 不定 參數與 陣列. 物件 參照. 以下的敘述稱為參照被宣告 Player player ; Player player2 = null ; // 宣告一個參照,初始為 null 一個剛宣告的參照並沒有實體,也就是說剛宣告的東西無法拿來使用,必須讓他指向一個有實體的東西才能使用。 // 將 player 設定為 new 出來的 Player player = new Player ();
E N D
物件參照 • 陣列 • Overloading 過載 • 不定參數與陣列
物件參照 • 以下的敘述稱為參照被宣告 Playerplayer; Player player2 = null; //宣告一個參照,初始為null • 一個剛宣告的參照並沒有實體,也就是說剛宣告的東西無法拿來使用,必須讓他指向一個有實體的東西才能使用。 //將player設定為new出來的Player player = newPlayer(); //將player2設定為new出來的Player,用(999,999)初始化 player2 = newPlayer(999,999);
物件參照 • 除了primitive的型別以外的類別,宣告時都是一個空的參照。 • primitive 也就是不可分割的基本型別,如 int, char, short, long, float • Object, String, 外覆型別以及我們目前定義的Player都是基於Object體系的
物件參照 • 物件參照如同C語言的指標,改變參照本身不會影響對應的物件內容。 • 假設有一個類別為NullSetter public class NullSetter{ public static void setNull(Object o){ System.out.println(“把Object設定為null”); o=null; } } • 使用方式 Playerplayer = newPlayer(); NullSetter.setNull(player); if(player == null){ System.out.println(“player被設為null了”); }else{ System.out.println(“player沒有被設為null”); }
Java陣列 • 陣列是一組相同的物件 • 陣列的大小在建立之後就不會改變
陣列 • 宣告陣列的語法為 • 型別[] 變數名稱 = new 型別[大小]; • 當型別為物件體系時,陣列的內容在宣告出來後相當於宣告區域變數,只有空的參照 • Ex: String[] array1 = new String[50];
陣列 • 每個陣列都有.length屬性,用來表達陣列的長度。 • 可以用[ 整數 ]存取陣列某一個元素 • Java陣列索引從0開始 • 陣列內的元素如果是物件,則需要另外初始化
陣列 • 初始化方式 • String[] array = newString[] { "1", "2", "3"}; • String[] array = { "1", "2", "3" }; • String[] array = { newString("1"), new String("2"), newString("3") }; • for(inti=0; i<array.length; ++i) • array[i]=new String(“”);
Method Overload(多載) • 讓同名稱的方法可以有多個版本 • 意義:讓同一個名稱的操作可以面對各式各樣的物件/目標
Method Overload(多載) • 建構子也可以過載 • 方法的簽名為 • 名稱,參數型別 • voidmethodA(int a); • voidmethodA (intb); • voidmethodA (boolean b); • voidmethodA (booleanb,int a); • 只要簽名不相同就可以共存
Method Overload(多載) • 編譯器會將各種多載依照不同的簽名在底層來命名函式 • voidmethodA(int a); • voidmethodA_int(int p1); • voidmethodA (intb); • voidmethodA_int(int p1); • voidmethodA (boolean b); • voidmethodA_boolean(booleanp1); • voidmethodA (booleanb,int a); • voidmethodA_boolean_int(booleanp1,int p2);
Method Overload(多載) • 編譯器會依照使用者傳入的參數自動幫忙決定叫用的版本 • methodA(true); • -> methodA_boolean(true); • methodA(1); • -> methodA_int(1); • methodA(false,0); • -> methodA_boolean_int(false,0);
Method Overload(多載) • 設定裝備 enumBodyPart { LeftHand, RightHand, Head, Body, Foot } voidequipArms(BodyPartpart, Knife s); void equipArms(BodyPart part, Sword s); void equipArms(BodyPartpart, Shields); void equipArms(BodyPart part, CrossBows); void equipArms(BodyPart part, LongSwords);
使用方式: Playerplayer = new Player(); Knifeknife = new Knife(1); //等級1小刀 Shieldshield = newShield(1);//等級1盾牌 player.equipArms(Player.BodyPart.LeftHand, knife); //在左手裝備小刀 player.equipArms(Player.BodyPart.RightHand,Shield); //在右手裝備盾牌
Q&A • 函式多載與簽名有關,簽名包括哪些部份
練習 • 角色基本素質是 • 力量30 (str) • 防禦20 (def) • 等級1 (level) • 攻擊力=力量+武器素質 • 防禦力=防禦+盾牌素質 • 設計一個Player類別,在建構子初始化上述屬性 • 而假設每提昇一個等級,力量加5,防禦加3 • 設計一個levelUp方法,叫用時顯示「等級提昇了,角色等級提昇為__,力量變成__,防禦變成__」
練習 • 在角色的類別設計一個裝備武器的方法叫做equipArms,參數有部位跟裝備。部位不對時顯示「無法裝備」,部位正確時,顯示「裝備了__道具」,順便顯示素質變化,比如「角色攻擊力變為__」
不定參數方法 • 如System.out.printf,可以像C語言的printf一樣接受多種參數 • System.out.printf不是利用overload來定義多個參數 • 設計人員不會知道使用者會傳入幾個參數 • 不定數目參數宣告方式為 • 函式(型別… 參數名稱) • 如: void printf(String fmt, Object… argv);
不定參數方法 • 不定參數在設計階段時,該不定參數會被視為陣列 int min(int… values){ //回傳最小值 int r = values[0]; for(inti=1; i<values.length; ++i){ if(values[i]<r){ r = values[i]; } } return r; }
練習 • 設計方法max取得不定參數最大值 • 設計方法sum取得不定參數總和 • 設計方法mean取得不定參數平均,回傳型別為float
Arrays • Math • Integer.toString(); • Integer.parseInt(); • 字串方法