350 likes | 492 Views
http://hpds.ee.kuas.edu.tw/. Java Programming. Presenter : Sunneo 2010/6/28. Outline. 萬物都是物件 採取物件導向的理由 選擇 Java 的理由 Java 語言特性 撰寫 Java 程式基本規範. 萬物都是物件. 你所看到的東西都是物件,不論有沒有名字 一枝筆 一張紙 一台電腦 一個桌子 一隻狗 有些東西有他們自己的特性與名字 一枝鋼筆、毛筆、鉛筆、原子筆、水性原子筆 影印紙、公文專用紙、複寫紙 桌上型電腦、筆記型電腦 木桌、電腦桌、書桌 ...
E N D
http://hpds.ee.kuas.edu.tw/ Java Programming Presenter : Sunneo 2010/6/28
Outline 萬物都是物件 採取物件導向的理由 選擇Java的理由 Java語言特性 撰寫Java程式基本規範
萬物都是物件 你所看到的東西都是物件,不論有沒有名字 一枝筆 一張紙 一台電腦 一個桌子 一隻狗 有些東西有他們自己的特性與名字 一枝鋼筆、毛筆、鉛筆、原子筆、水性原子筆 影印紙、公文專用紙、複寫紙 桌上型電腦、筆記型電腦 木桌、電腦桌、書桌... 一隻會叫的狗、一隻黑色的狗、一隻懶狗
萬物都是物件 一張紙 可以拿來書寫、拿來摺紙飛機、 拿來割傷手指、拿來墊便當、紀錄文件、可以一分為二 有重量、面積、材質、顏色、年份、資料 一枝筆 可以撰寫、可以紀錄文字、可以畫畫 有色澤、種類、重量、筆頭、筆心、廠牌、造型、長度 一隻狗 會走路、會跳、會叫、會咬人、會認路 有毛、有腳、有尾巴、有長度與重量
萬物都是物件 一個物件 有類型跟名稱 有操作 有屬性
萬物都是物件 常見物件 獨立物件(Singleton Object) 全世界只會有這樣一個獨一無二的物件 使用時必須排隊(ex:顯示卡) 容器物件(Container Object) 用來存放東西 幫助整理其他物件 用來包裝其他物件、用以達成擴充功能 中介物件、橋樑物件(Bridge Object) 單純為了完成某種事情而生的物件 未必具有實質意義
採取物件導向的理由 為什麼需要物件導向?
採取物件導向的理由 對於屬性與方法的擁有者相當明確 一枝筆的重量 一個檔案的大小、位置 操作的抽象 操作抽象化有助於系統設計與模組化,不需在設計初期關心內部實做 ex:拿起筆再紙上寫字、紀錄資料 不用考慮筆跟紙的類型、以及該怎麼書寫 筆壞了可以換一枝筆 物件不適用時換掉物件。
選擇Java的理由 完整支援物件導向特性 物件導向的好處與理論可以直接套用 跨平台 開發者可以擁有大量的開發資源,別人設計的東西可以使用 設計的軟體可以直接跨硬體、作業系統運作 語法與C語言類似 學習門檻低 具有垃圾回收機制 基本上不用手動處理記憶體問題
選擇Java的理由 並非硬式物件導向 有很多方法支援非物件導向程序 Java基本系統底層仍透過Native Interface運行 型別安全 不能任意的轉型,只能向上或向下轉型 任意轉型會轉型失敗 這使得資料類型是公開且固定的 具有邊界檢查(Boundary Check) 當存取超過陣列長度時會引發錯誤 這使得記憶體存取相當安全
選擇Java的理由 支援RTTI (RunTime Type Information)以及Reflection 物件型別絕對公開 不論型別為何,都可以取得Class定義 可以使用(物件.class)取得物件的來源名稱
Java語言特性 一個package是一種資料夾。 可以藉由資料夾將大量設計的class分門別類。 比如io就放跟資料/檔案操作有關的class 所有的一切由class開始 這是一種定義類別的關鍵字 型別概括具有兩種 Preemptive type 可切割的型別、一般我們撰寫的都是此類別 Non-preemptive Type 不可切割的、系統原生型別
Java語言特性 Non preemptive type boolean char byte, int, short, long float, double void (僅用於函式/方法回傳值) non preemptive type組成的陣列仍為non-preemptive String 這比較特別,字串是唯一不可切割、具有操作方法,且不屬於Object的型別
Java語言特性 Preemptive type 因為萬物都是Object,所以定義的任何型別都是一種Object 由多種Preemptive type與non-preemptive type組合成。 Object是一種Preemptive type Object[] 也是Preemptive type ( Object陣列)
Java語言特性 因為non-preemptive不符合萬物皆為物件的條件,因此Java提供了Wrapped Class,以大寫開頭命名 Int → Integer Float → Float double → Double boolean → Boolean short → Short long → Long char → Char Byte → Byte Void → Void
HelloJava範例 來個HelloJava.java範例
Java語言特性:Class Class前面加上visibility是用以決定該class的可見範圍 public: 所有資料夾可見 package: 同一個資料夾可見 常用於一些內部開發套件,這些package class不希望被其他人使用。 static加在class前面:這只能允許在inner class class內有class,且希望該class等級與外部的class相同
Java語言特性:Class Class visibility 假設AnotherClass要使用HelloJava AnotherClass跟HelloJava不同資料夾
Java語言特性:Class Class visibility 一旦將HelloJava改為package visible 則AnotherClass會無法使用
Java語言特性:Class Class前加上final,表示這個class的家族到此為止 通常是在該class定義已經達到極致時。 Class前加上abstract 用於繼承體系,表示這個class不得有實體 通常用以表達抽象觀念與種類,或稱為meta class Ex: Dog 所有的狗的物種都應該有他的名稱,不應該出現一種狗,使得類別只叫做狗
Java語言特性:Class Class field中,Preemptive 型別初始值皆為null或0 method內區域變數不會初始化 宣告在class內的物件即為這個class所擁有,因此class內所有method都可以存取 Static function member只能存取static的物件 宣告為static的method只能存取class的static field. 每個宣告都有他們的存取權限(visibility) 預設為package
Java語言特性:封裝 什麼是封裝(Encapsulation)
Java語言特性:封裝 封裝通常是透過存取權限來達成 Package (不寫任何修飾) 同資料夾可存取 Public 所有外部類別皆可存取 Private 僅這個class內可以存取 Protected 繼承體系可以存取
Java語言特性:封裝 存取權限的用途:封裝 僅開放期待公開的操作,隱藏不必被看見的 知道怎麼操作,未必要知道內部構造 避免內部元件被惡意或無意的竄改 Ex: 不一定要直接操作電視內的電路才可以看電視 製作電視的人不會希望自己的產品被抨擊的原因是來自於使用者的惡意使用 你不能因為把別人電視機內部主機板弄壞了就說電視機品質不好。
Java語言特性:封裝 封裝確立了製作一個Class的責任(Responsibility) 讓一個class功能完整是class作者的任務 如果一個產品有錯,會由內部組件進行責任追究 Class也是一樣的 一切軟體都是透過封裝跟組合建立而成 當一個功能有誤,則表示某物件的操作有問題
Java語言特性:封裝 messageFromInit為private,不期待被使用
Java語言特性:封裝 使用時會引發錯誤
Java語言特性:陣列 對於Preemptive型別的陣列,如果採用動態陣列,則生成的陣列為參照陣列 參照陣列的每個參照並未握有物件,需要一個一個建立物件 Java沒有為陣列自動生成物件的運算子 HelloJava [] helloArray = new HelloJava[5]; HelloJava [] helloArray2 = new HelloJava[]{ new HelloJava("1"), new HelloJava("2"); }; 陣列本身具有length屬性,代表陣列的長度。
Java語言特性:參數與函式 參數傳遞皆為Call by reference 但是reference本身是不可修改的。 本身規則類似Call by address public void func(A a){ A b = new A(); a = b; //不影響傳進來的a a.doSomething(); //可能會改變a的內容 }
Java語言特性:參數與函式 參數以final修飾,表示參數為唯讀 函式以final修飾,表示函式本身不可被複寫 是一種leaf函式 通常用於全世界只會有一種定義的函式,且絕對不容許第二種同名定義。 函式以static修飾,表示函式本身不需要該class,該函式與class同等級 函式內不得有static變數 跟C/C++不同
Java語言特性:屬性修飾 Static變數或方法的存取階層與class同等 存取方式必須透過class名稱 Ex: Math.class 屬性一旦被final修飾,則表示這個屬性不能被修改 屬性為唯讀(Read Only) 與C/C++的const相同。
撰寫Java程式基本規範 Class命名一定要大寫開頭,每個分開單字以大寫起始 Ex: 沒有名字的 Unnamed class Unnamed Ex: 拿鐵咖啡class coffee latte class CoffeeLatte
撰寫Java程式基本規範 屬性與方法(field)命名可以一致,以小寫開始,其餘字用大寫開頭 Ex: 3-線-鼠的物件 threeLineMise Ex: 一杯拿鐵咖啡的物件 coffeeLatte 偶爾可以套上用途作為命名 操作方法盡量使用動詞 Ex: drink, setValue , play, isHit, canJump, getValue
撰寫Java程式基本規範 請遵循Java的排版風格(Attach Style) 大括號起始點接在行的尾巴,終點對準敘述起點 private void function(){ if (true){ doNothing(); } } 如果懶的手動排版,請記得使用astyle或者eclipse/netbeans的format(save action)排版
http://hpds.ee.kuas.edu.tw/ Thank You !