Java語言特性:Class

Download Report

Transcript Java語言特性:Class

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