發表文章

目前顯示的是 7月, 2007的文章

Java筆記: Casting 形態轉換

今天看到一個覺得非常有趣的程式,嘻嘻! 有一個程式碼的內容是這樣 class Animal {} class Dog extends Animal{ } public class CastTest {  public static void main(String[] args) {   Animal animal = new Animal();   Dog d = (Dog) animal;   String s = (String) animal;  } } 目測這隻程式毫無疑問的,它是錯的不能編譯,因為下面這兩行的cast形態不符   Dog d = (Dog) animal;   String s = (String) animal; 不過若我將第二個會發生錯誤的去除,結果竟然是這隻程式可以編譯了,但是執行時丟出了ClassCastException,人覺得這應該是可以直接判斷出來的結果,但是為什麼不會在編譯時期查出來? Upcasting & Downcasting Upcasting 由子類別轉換為父類別 這種轉換是可以立即被Compiler察覺的,利用繼承樹馬上就可以判斷是否子類別是否是繼承自父類別。 這個部分可以說是多型(Polymorphism)的利用,此外,upcasting是隱式轉換Compiler會自動進行轉換。 Downcasting 由父類別轉換為子類別 這種轉換沒有辦法馬上知道最後的結果,只能判斷是否在同一個繼承樹,其他就必須在runtime才會知道,最常見的例子就是寫GUI時。 public void actionPerformed(ActioEvent e){  Object s = e.getSource();  if (s instanceof JButton) {   JButton btn = (JButton)s;   ....  } else if (s instancef JList) {    JList lst = (JList)s;    ....  } } 產生事件的物件,並不能在編譯時期就能決定,只有在Runtime才能決定,不過編譯器還是會檢查繼承樹,在這個例子中,父類別是Object,Downcast成兩種JButton、JList,在Java中任何物件都繼承自O

書籍程式碼修改應用:Sprite Demo

圖片
書籍名稱 Java Game Programming 建立遊戲的演算法與框架 , 長久勝 著 柯至杰 譯,博碩出版 程式功能 利用作者所提供的Sprite類別,一個具有將圖片載入、自訂層次、合併顯示功能的類別,而寫出一個隨機顯示切割成九張小圖片的小程式。Sprite類別的少部份內容被我作修改,以符合我所需要的繪圖方法。 程式碼 書籍程式碼超過500行,而我寫的也有200行,直接發表實在有夠長,故不直接將程式碼放置在文中。 下載連結 若連結失效麻煩寄信給我,我會再回信給你,謝謝。 ← 內容物預覽圖 題外話 要將程式碼上傳到FTP伺服器時,找FTP傳輸軟體找好久。其實是我根本就沒有裝,自從小蟲介紹給我FireFTP之後,我就沒有額外再裝過FTP傳輸軟體了。

Java小程式:Slider Demo

程式名稱: Slider Demo 程式功能: 預先讀取圖檔,有進度表顯示目前已讀取的進度,讀取完畢後依照順序顯示圖片,每秒切換一張圖片,循環顯示這些圖片。 使用到的東西: MediaTracker、Thread、Timer、Java 2D 程式原始碼: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Slider extends JPanel  implements Runnable, ActionListener {  // 這裡是要修改的檔案張數  final int readed_img = 30;  private Image[] image = new Image[readed_img];  private int nowindx;  private Image nowimg;  private int State;  private javax.swing.Timer gtimer = new javax.swing.Timer(1000 ,this);  private MediaTracker tracker = new MediaTracker(this);  private Font FS = new Font("標準楷",Font.BOLD,35);  Slider () {   setLayout(null);   setPreferredSize(new Dimension(800,600));   setDoubleBuffered(true);   for (int i=0 ; i < readed_img ; i++) {    // 這裡是要修改的圖檔檔名    image[i] = Tool.getImage("img/gurumins ("+i+").jpg");    tracker.addImage(image[i], i%5);   }   State = LODING_STATE;   new Thread(this).start();  }  public void run() {   System.out.println("Load

小程式:FnameReviser

程式名稱: FnameReviser 程式功能: 將一群副檔名不符合的改唯一致化的副檔名,具有副檔名的就改掉副檔名,沒有副檔名的就直接加上副檔名。 參考資料: Micorsoft MSDN2:類別庫參考 system.array system.random system.io.directory system.io.file system.string 程式流程: request User for 指定的目錄 if isExist & isDirectory = false then   show error msg and   exist program.   for each 檔案 in 指定的目錄     origin_name <- the 'Name' of 檔案     if subname of origin_name != JPG then       new_name <- origin_name + '.JPG'       if new_name is an exist file in the 指定的目錄 then         new_name <- random generate a name       rename from origin_name to new_name in the 指定的目錄 完成程式碼: using System; using System.IO; class FnameReviser {  public static string CONST_EXT_NAME = "jpg";  public static string CONST_APPEND_EXTENSION = "." + CONST_EXT_NAME;  public static int CONST_RAND_GEN_NAMELEN = 24;  public static Random rand = new Random();  public static void Main(String[] args) {   string origin_name = null;   string new_name = null;   strin