Ch09 物件導向技術導論(二) Java程式設計(2)
類別的定義-類別的定義語法 修飾字 class 類別名稱 //類別的標頭 { // 屬性宣告 // 建構子定義 // 方法定義 }
類別的定義-類別的修飾字 public-公開類別,宣告成此種類別可以被任何類別所使用。 無修飾字(default)類別,此種類別僅能被同一套件(package)內的類別使用。 final-此種類別不可被繼承。 abstract-此為抽象類別的修飾字。此種類別至少擁有一個抽象方法,不可用於直接建立物件
類別的定義-類別的命名規則 類別名稱的第一個字母應該大寫,如:Car、Person。 若是由兩個字以上組成時,每個單字的第一個字母為大寫,如:CarClass。 名稱中包括縮寫時,所有縮寫字母為大寫,如:URL。 class EmptyClass { }
建立物件 宣告物件 建立物件實體 宣告並建立物件實體 類別名稱 物件名稱; 物件名稱 = new 類別名稱(); 類別名稱() 為建構子呼叫 類別名稱 物件名稱; 建立物件實體 物件名稱 = new 類別名稱(); 類別名稱() 為建構子呼叫 宣告並建立物件實體 類別名稱 物件名稱 = new 類別名稱();
物件名稱 物件名稱必須是合法的識別字。 其命名規則為第一個字的字母皆為小寫。 若為複合字時,其餘字的第一個字母為大寫 若為縮寫字母時,皆為小寫。
範例1: 宣告及初始化物件 class Ch02_01 { public static void main(String [] args) EmptyClass emptyClass = new EmptyClass(); Ch02_01 ch02_01 = new Ch02_01(); System.out.println(emptyClass); System.out.println(ch02_01); } class EmptyClass 輸出結果 有幾個class在你的目錄下? 在一個程式檔中有兩個class?? Ch02/Ch02_01.java
屬性(1) 屬性的宣告語法 存取權限相關的修飾字 public-公用級,所有類別皆可使用此級屬性。 修飾字 資料型態 屬性名稱; 存取權限相關的修飾字 public-公用級,所有類別皆可使用此級屬性。 protected-保護級,同一套件內及其子類別可以直接使用。 無修飾字-預設級(default)或稱套件級,同一套件內的類別可以直接使用。 private-私有級,屬性所在的類別才能使用。
屬性(2) 使用final修飾字自訂常數 static修飾者為類別屬性 使用點(dot)運算子指出取用的屬性 public final int wheels = 4; static修飾者為類別屬性 類別屬性是同一類別中所有物件所共有,不屬某個物件 使用點(dot)運算子指出取用的屬性 屬性只要宣告就會自動初始化,設上預設值
範例2-系統需求 建立一個日期系統,每一個日期的值包含有年、月、日。顯示昨天、今天、明天的資料
範例2-系統分析 Date Day:int Month:int Year: int today:Date yesterday:Date tomorrow:Date
範例2-程式設計 為什麼明天的日期是0-0-0 class Ch02_02 { public static void main(String [] args) Date today = new Date(); Date yesterday = new Date(); Date tomorrow = new Date(); today.day=14; today.month=3; today.year=2007; yesterday.day=13; yesterday.month=3; yesterday.year=2007; System.out.println("今天的日期是: " + today.year + "-" + today.month + "-" + today.day); System.out.println("昨天的日期是: " + yesterday.year + "-" + yesterday.month + "-" + yesterday.day); System.out.println("明天的日期是: " + tomorrow.year + "-" + tomorrow.month + "-" + tomorrow.day); } class Date int day; int month; int year; 為什麼明天的日期是0-0-0
活化腦、手運動(1) 修正範例2的程式Ch02_02.java,使得 “明天”的日期是正確的
活化腦、手運動(2) 考慮一下,下列情況: 在範例2的程式碼中,有兩個class ,是不是要在同一個檔案中??? 測試: 建立一個新的資料夾Ch02_02(為了避免與範例2中,已經建立的類別相干擾) 將class Ch02_02程式碼存到Ch02_02資料夾下,此程式檔案的名稱是Ch02_02.java 將class Date程式碼存到Ch02_02資料夾下,程式檔案的名稱是Ch02_02_01.java 先編譯Ch02_02_01.java (javac Ch02_02_01.java) 再編譯Ch02_02.java (javac Ch02_02.java) 再執行Ch02_02.java (java Ch02_02) 為什麼456的順序不可以改變??? Ch02_02/Ch02_02_01.java ; Ch02_02/Ch02_02.java
範例3: 什麼是private class Ch02_03 { public static void main(String [] args) Date3 today = new Date3(); Date3 yesterday = new Date3(); Date3 tomorrow = new Date3(); today.day=14; today.month=3; today.year=2007; yesterday.day=13; yesterday.month=3; yesterday.year=2007; System.out.println("今天的日期是: " + today.year + "-" + today.month + "-" + today.day); System.out.println("昨天的日期是: " + yesterday.year + "-" + yesterday.month + "-" + yesterday.day); System.out.println("明天的日期是: " + tomorrow.year + "-" + tomorrow.month + "-" + tomorrow.day); } class Date3 private int day; private int month; private int year; Ch02/Ch02_03.java
範例4:什麼是static class Ch02_04 { public static void main(String [] args) Date4 today = new Date4(); Date4 yesterday = new Date4(); Date4 tomorrow = new Date4(); today.day=14; today.month=3; today.year=2007; yesterday.day=13; yesterday.month=3; yesterday.year=2007; System.out.println("今天的日期是: " + today.year + "-" + today.month + "-" + today.day); System.out.println("昨天的日期是: " + yesterday.year + "-" + yesterday.month + "-" + yesterday.day); System.out.println("明天的日期是: " + tomorrow.year + "-" + tomorrow.month + "-" + tomorrow.day); } class Date4 static int day; static int month; static int year;
範例5:物件屬性與類別屬性的差別 class Ch02_05 { int i = 0; static int s = 100; public static void main(String [] args) Ch02_05 obj1 = new Ch02_05(); Ch02_05 obj2 = new Ch02_05(); obj1.i++; obj1.s++; obj2.i++; obj2.s++; System.out.println("obj1.i = " + obj1.i); System.out.println("obj1.s = " + obj1.s); System.out.println("obj2.i = " + obj2.i); System.out.println("obj2.s = " + obj2.s); //System.out.println("Ch02_05.i = " + i); System.out.println("Ch02_05.s = " + s); }
類別成員和物件成員的區別
範例6:指向同類別的參照變數 class Ch02_06 { int i = 0; static int s = 100; public static void main(String [] args) Ch02_06 obj1 = new Ch02_06(); Ch02_06 obj2 = obj1; obj1.i++; obj1.s++; obj2.i++; obj2.s++; System.out.println("obj1.i = " + obj1.i); System.out.println("obj1.s = " + obj1.s); System.out.println("obj2.i = " + obj2.i); System.out.println("obj2.s = " + obj2.s); //System.out.println("Ch02_06.i = " + i); System.out.println("Ch02_06.s = " + s); }
活化腦、手運動(3) 承手腦運動(1),建立一個新的物件birthday,指向today
大富翁 class 玩家 class 大富翁 { String 名字; int 錢; int 位置; } class 土地 { String 地名; int 售價; class 大富翁 { public static void main(String [] args) { 玩家 a = new 玩家(); a.名字="灰太狼"; a.錢=1; System.out.println(a.名字+" 有 " +a.錢 + "元"); }