2006/09/27

物件導向 OOP - Java

大學生活差不多快一個月了,全部的課起碼都上過一遍了。
不管是所謂的勞作教育(外掃)也好,還是通識課程的講座也好,都有初步的認識。
其中屬於資管本系的課程之中,有個「物件導向程式設計」,教授選Java作為學習對象。

我第一次接觸Java大概是在2001年左右吧,由於開始學習HTML/JavaScript的緣故,
對後者的技術和展示成果特別有興趣 (現在還有AJAX就知道這真是歷久不衰啊w)
我喜歡在常逛的書店的電腦書區看書,這是我當時的興趣和習慣。
無意間看到了手上這本「Java2程式設計」。當時看了一下一來他的SDK免費 (VB6當時要買),
二來用記事本即可寫作、三來語法看起來跟有興趣的JavaScript很像,於是就買回家讀了。
當時有一位大學生一類的人士看到我在讀這本書,還問我:你看的懂嗎?
我當然跟他說我看不懂,不過我說我對他有興趣,想把它學起來。

買了那本書後,我的確裝起了Java 2 SDK 1.3.0 (當時版本),也成功了用記事本寫出了Hello World,
後來更因為感到開發環境的簡陋和不便,自行用VB6寫了個JavaEditor,除了原本記事本的用途,
更可以一指直接呼叫javac編譯 & java預覽成果,還附上工具箱收錄常用的幾個類別庫,免去打字麻煩。
只不過後來有感於Java開發GUI程式很不直覺 (沒有介面可拉只能靠文字設定)、和當時的不普及性,
很快就放棄了。

直到現在(2006年),我重拾了這本書,搭配物件導向程式設計的教學用原文書,開始從無到有再學起Java,
希望能夠順利。我之前也學過Delphi也是有感於Pascal的怪異性後來就放棄了。
至少我還有基礎嘛...型別、物件、屬性和方法、繼承、實作、多型、覆寫等等我都還知道。
雖然JavaScript不等於Java,內容也相差十萬八千里,但很多核心東西還是重複的。
後者所提供的類別還在不斷更新中,就我以前所知的java.util.Date的getYear()等方法竟然都取消了orz
現在換什麼java.util.Calendar的,有夠怪。

我覺得Java難學的地方在於它對型別的重視,和類別庫太大了。
前者很多程式語言都沒有嚴格限制,反正系統會幫你轉換嘛...
Java似乎沒這麼神,變數定義和方法輸出的型別都要符合才OK啊。
印出資料的時候幾乎都要先toString()再來+++串在一起輸出。
(我現在還是搞不懂int為什麼不能toString(),轉不了是要怎樣跟字串連在一起輸出?)
---
算是資管課程比較偏技術面而非應用面的東西吧,我就喜歡這個咧XD
讀不成資工而去讀資管,也只能妥協了,不過資管也是資訊和管理的複合科系,都可以學一點。

9 則留言:

  1. >我現在還是搞不懂int為什麼不能toString(),轉不了是要怎樣跟字串連在一起輸出?

    int j=10;
    System.out.println("j is " + j);

    回覆刪除
  2. 本人選修了一學期的C++,所以可以說Java算是簡單的語言了。
    因為C++需要將記憶體位置、位元名稱與內容三部分都要分清楚的,很多動態資料還要自己清垃圾……
    萬一清的不好,C++一個錯誤都不會丟出,讓你的程式自生自滅,不然就是Buffer Overflow……^_^|||

    int不能使用toString()。
    因為你們教授大概還沒有教到Primitive Data Type與Object的差別。
    在Java內,除了int, short, long, float, double與boolean之外,都是Object (物件)。
    所有物件都繼承java.lang.Object,同時也繼承public String toString()與public boolean equals()。
    之後應該會學到可以自己定義這兩項函式。
    如果需要將PDT轉為Object的話,
    可以使用Wrapper classes如Integer常用的Integer.parseInt(String s)。

    學Java還是有很多好處。
    不只是外面薪水比較高、程式標準要求嚴格,同時也是C#的始祖。
    我現在也正在學GUI,這樣明年可以選修3D繪圖或用AWT/Swing寫Java程式……^^/

    回覆刪除
  3. 以上受教了。
    的確我對於Java的型別還不夠深,所以很多觀念仍有偏差。
    大概是受其他語言荼毒以為都一樣吧XD

    原來型別也是繼承自Object的啊,還以為他是系統的特殊結構。

    Java的應用面好像都是可攜式裝置比較多,
    真正在個人電腦上還是不太吃香吧,光那解譯加直譯的JVM的速度就不敢領教了。

    回覆刪除
  4. >我現在也正在學GUI,這樣明年可以選修3D繪圖或用AWT/Swing寫Java程式……^^/
    這個是Java程式的極至吧 XD
    http://www.visual-paradigm.com/product/vpuml/
    一個和UML有關的IDE...全用Java編寫
    光啟動就吃了接近100M memory
    我學校的軟體開發部榮譽出品 XD

    回覆刪除
  5. 對RT網友的回應做補充。
    System.out.println("j is " + j);之所以沒有問題,是因為由java.lang直接定義。
    "j is " + j編譯器會自動轉成"j is ".concat(j) [String.concat()]。
    System.out則為系統內定PrintStream物件。

    現實世界中到不用JVM翻譯器,畢竟速度比C++慢約十倍。
    大企業通常用如IBM的Java JIT及時編譯器,速度跟C++相當,只是普通人無法入手而已。
    .NET作業平台語言都是及時翻譯的,所以Java JIT速度跟VB、C#等幾乎一樣。
    由於Java的超高安全性,在金融界、醫療界、伺服器 (JSP)、AJAX (Java + JavaScript)、NASA火星探測機等領域使用。
    詳情可看此網頁:Java Technology in the Real World

    你是還好只有需要學基礎Java而已。
    我從大學入學前完全沒有程式經驗,到現在摸過……
    3年Java
    選修C++
    機械碼 (ARM + MIPS)
    電腦邏輯迴圈繪圖
    證明Subset Sum題目為NP-Complete (假設有自然數w1,...,wn與目標W。請問是否有個組合能剛好加起來等於W?)
    尋找所有座標中最接近的兩點時,用無限劃分法將n!問題難度減至n平方。
    語言學 (學標準邏輯語言定義並且設計能夠將程式文字轉化為相對的機械碼)
    作業平台 (解決Critical Section問題。假設有兩個同時運行的函式要讀取與寫入同樣的記憶體區塊,確保資料安全性、進展速度與避免雙函式互相卡死)

    最後一年了,還有人工智慧、資料庫理論、編譯器設計、軟體工程學、平行運算、電腦限界理論 (用數學證明電腦有一天可能通過Turing人工智慧考試等)、安全通訊/密碼學、抽象式程式設計 (100%邏輯語言)、電玩引擎設計、遊戲理論、etc……

    希望畢業前,還能活著出來……ORZ

    回覆刪除
  6. >"j is " + j編譯器會自動轉成"j is ".concat(j) [String.concat()]。
    學到東西了,感恩 ^^

    >.NET作業平台語言都是及時翻譯的,所以Java JIT速度跟VB、C#等幾乎一樣。
    說實話,.NET的速度還是比不上C++

    回覆刪除
  7. >>>"j is " + j編譯器會自動轉成"j is ".concat(j) [String.concat()]。
    >>學到東西了,感恩 ^^

    過獎了。
    這是過去看教科書解釋才知道的,上課都沒提到。

    >>>.NET作業平台語言都是及時翻譯的,所以Java JIT速度跟VB、C#等幾乎一樣。
    >>說實話,.NET的速度還是比不上C++

    但是,Java可以用try {...} catch (Exception e) {...}。
    寫得好的話,可以讓程式像從來沒有發生過錯誤一樣。
    程式穩定性100%。
    通常第一年基礎Java就會教到。
    就像是現在WinXP幾乎沒有藍色死亡螢幕了一樣。
    所以速度慢還是值得的。
    C++寫什麼物件都要考慮到constructor、copy-constructor、overloaded constructor與destructor。
    光是呼叫個函式就有可能不小心將原物件整個消除掉,如果沒有附上copy-constructor……
    沒有destructor,更有可能將你的電腦記憶體在幾秒內瞬間吃光……
    數字列陣出了範圍還會繼續讀取一堆亂碼,一個警告都不發出的繼續運作……

    像底下三行示範:
    >>std::string s3 = p;
    >>s3 += " World!";
    >>p = const_cast<char*>(s3.c_str());
    C++可說跟機械碼一樣難閱讀……^_^|||

    回覆刪除
  8. >就像是現在WinXP幾乎沒有藍色死亡螢幕了一樣。
    >所以速度慢還是值得的。
    是啊...我家的XP亂碼(繁體中文都變???碼)橫行, 剛剛我才把文字服務搞壞了, 沒辦法修復移除, 系統還是跑得好好的 XD

    >C++可說跟機械碼一樣難閱讀……^_^|||
    這和Programmer的Coding style有關吧
    寫得好的會像參考書上的好看, 寫得爛的比Assembly難看 XD
    就像Jserv大的: http://blog.linux.org.tw/~jserv/archives/001797.html

    回覆刪除
  9. 即使如此C++還是資訊工程學系學習的首要語言 XD
    如果C++能跟VB一樣容易有多好啊(炸
    C有不少低階的東西,看都看不懂orz
    以後也得花時間學習吧,這種東西就像吃飯工具,越多越好。

    當程式碰到嚴重錯誤時還能掌控,並若無其事的回報錯誤訊息給使用者看,
    真的是很強啊。

    所以說很多事情語言本身都幫你處理好了不是?
    令人頭痛的記憶體管理機制(雖然我尚未遇上)和一堆雜七雜八的東西。

    總之我還有很長的路得走XD

    回覆刪除