Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 XML與Java物件導向程式設計 4-1 XML的基礎 4-2 類別與物件 4-3 類別的繼承 4-4 巢狀類別與匿名內層類別

Similar presentations


Presentation on theme: "第4章 XML與Java物件導向程式設計 4-1 XML的基礎 4-2 類別與物件 4-3 類別的繼承 4-4 巢狀類別與匿名內層類別"— Presentation transcript:

1 第4章 XML與Java物件導向程式設計 4-1 XML的基礎 4-2 類別與物件 4-3 類別的繼承 4-4 巢狀類別與匿名內層類別
4-5 常數類別與抽象類別 4-6 介面與套件 4-7 執行緒 4-8 集合物件與泛型

2 4-1 XML的基礎 4-1 XML的基礎 4-1-2 XML文件的內容 4-1-3 XML文件的組成元素 4-1-4 XML文件的命名空間

3 4-1 XML的基礎 XML(Extensible Markup Language)是W3C建議規格的標示語言(Markup Language),可以讓使用者建立特殊用途的標示語言來建立所需的XML文件(XML Documents),例如:定義Android應用程式資源的XML檔案。

4 4-1-1 標示語言的基礎 – 說明 XML和HTML都是一種標示語言(Markup Language),標示(Markup)是一種方法讓資料擁有描述資料本身的資訊。例如:在讀書時,我們常常使用黃色螢光筆在書中的某些句子作上記號,因為這些句子是考前複習的重點。 當我們在書中的某些句子劃上黃色螢光線時,就是在標示資料,表示這些句子的資料很重要。簡單的說,我們使用黃色螢光筆替句子加上描述資訊,描述這些句子是考試重點。當我們在進行標示操作時,需要注意兩件事,如下所示: 標示方法:定義如何標示是合法標示,以此例是劃上黃色螢光線。 標示的意義:標示代表的意義,以此例是代表考試重點。

5 4-1-1 標示語言的基礎 – 範例 對於電子檔案的文件來說,標示文件資料就是使用標示語言,標示語言通常是使用標籤(Tags)的標示方法來標示資料,標籤名稱代表標示的意義,如下所示: <author>陳會安</author> 上述「<」和「>」符號括起的是標籤,標示資料【陳會安】,標籤名稱author表示標示的資料是作者。當文件使用標示語言處理後,文件除了內容外,還包含描述資料的標籤。

6 4-1-2 XML文件的內容 – 定義內容(Defining Content)
在本書是作者。 在Web網站是管理者。 在公司是程式設計師。 在家中是爸媽的兒子。 在XML可以使用<author>、<webmaster>、<programmer>和<son>標籤來定義文件的內容,如下所示: <author>陳會安</author> <webmaster>陳會安</webmaster> <programmer>陳會安</programmer> <son>陳會安</son>

7 4-1-2 XML文件的內容 – 結構資訊(Structured Information)1
當定義XML文件的內容後,事實上,我們就是在建立結構資訊,結構資訊除了告訴電腦顯示資料外,還包含資料本身的描述資料,稱為Metadata中繼資料。 例如:XML文件除了告訴應用程式筆者的姓名資料外,還提供結構資訊的作者author、網站管理者webmaster、程式設計者programming和兒子son,這是描述姓名資料的Metadata資料。

8 4-1-2 XML文件的內容 – 結構資訊(Structured Information)2
<book> <bookID>F1772</bookID> <title>Android SDK床程式設計範例教本</title> <author>陳會安</author> <price>620</price> </book>

9 4-1-3 XML文件的組成元素 – PI PI(Processing Instructions)允許XML文件包含傳送給應用程式的指令。PI的基本格式是以「<?name」字串開始,「?>」字串結束,如下所示: <?name pi_data?> 上述name是「PI目標」(PI Target)名稱,其中xml和XML是保留給XML使用,名稱是一個PI識別字,應用程式可以依照此名稱處理所需的PI,而不處理其他PI。例如:XML文件開頭宣告就是PI,這些資訊是告訴XML剖析器如何處理XML文件,如下所示: <?xml version="1.0" encoding="utf-8" ?> 上述PI並不屬於XML文件內容,version是XML版本,encoding是文件內容的編碼,Android是使用utf-8編碼。

10 4-1-3 XML文件的組成元素 – 元素(組成) XML文件是由元素(Elements)組成,XML元素和標籤不同,其意義如下所示:
標籤(Tags):XML能夠自己定義標籤,一個標籤是標示文件的部分內容。例如:標籤<resources>、<string>、<string-array>和<color>等,標籤分為開始標籤<resource>和結尾標籤</resource>。 元素(Elements):XML元素是整個文件的主要架構,元素是標籤加上其中的文字內容,或在元素中包含其他元素,基本上,元素是一個完整項目,包含標籤、屬性、開始標籤、標籤內的文字內容和結尾標籤。

11 4-1-3 XML文件的組成元素 – 元素(範例) XML元素需要由開始和結尾標籤構成,在其中包含文字內容。例如:XML元素color,包含值#800F,如下所示: <color>#800F</color> 在XML元素還允許包含其他子元素。例如:在resource元素擁有string-array子元素,string-array元素擁有item子元素,如下所示: <resources> <string-array name="color_names"> <item>白色</item> <item>黑色</item> <item>藍色</item> <item>紅色</item> <item>黃色</item> <item>綠色</item> </string-array> </resources>

12 4-1-3 XML文件的組成元素 – 元素(空元素標籤)
如果在開始和結尾標籤之中沒有任何內容,稱為空元素標籤,其語法有兩種,如下所示: <tag_name /> <tag_name></tag_name> 上述兩種寫法都是空元素標籤,如果空元素標籤沒有結尾標籤,標籤需要使用「/>」符號結束,例如:<Button>標籤,如下所示: <Button/> <Button></Button>

13 4-1-3 XML文件的組成元素 – 屬性 XML屬性可以替XML元素新增一些額外的資訊,屬性是位在開始標籤的標籤名稱之後,這是一個屬性(Attributes)清單,每一個屬性擁有屬性名稱和值,屬性值需要使用引號括起,Android是使用雙引號,如下所示: <color name="background_color">#800F</color> 上述<color>標籤擁有name屬性,其值為background_color。

14 4-1-4 XML文件的命名空間 – 說明 因為XML元素和屬性名稱都是使用者自行命名,對於愈來愈多各種不同公司、組織或個人建立的XML文件,當XML文件引用其他XML文件的架構或元素時,就有可能產生名稱重複的問題。 XML命名空間(Namespace)可以解決與其他公司進行XML資料交換時,避免標籤或屬性名稱重複的問題。

15 4-1-4 XML文件的命名空間 – XML標籤的完整名稱
<命名空間字首:標籤名稱> 上述標籤名稱在「:」符號前是命名空間的「字首」(Prefix),可以將它視為是代替命名空間字串「URI」(Uniform Resource Identifier)的一個縮寫。 在「:」符號之後才是我們命名的標籤名稱。換句話說,同一份XML文件,就算之後的標籤名稱相同,只要命名空間不同,XML剖析器一樣可以分辨出是屬於不同的標籤,如下所示: <bk:title> <jb:title>

16 4-1-4 XML文件的命名空間 – 在Android的XML檔使用的命名空間
在Android專案定義資源是使用XML文件內容的檔案,其根元素需要宣告命名空間來識別是Android系統的屬性,例如:宣告使用介面的XML檔activity_main.xml,其內容如下所示: <LinearLayout xmlns:android= android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

17 4-2 類別與物件 4-2-1 物件的基礎 4-2-2 Java的類別與物件 4-2-3 過載方法與串流呼叫方法
4-2-4 靜態成員與靜態初始程式區塊

18 4-2 類別與物件 「物件導向程式設計」(Object-oriented Programming,OOP)是一種更符合人性化的程式設計方法,因為我們本來就生活在一個物件的世界,思考模式也導循著物件導向模式。 物件導向技術有三個重要觀念:物件(Object)、訊息(Message)和類別(Class),其簡單說明如下所示: 物件:提供資料和方法的封裝。 訊息:物件之間的溝通方式,可以建立互動和支援過過載和多形觀念。 類別:物件的分類,可以實作類別架構的繼承。

19 4-2-1 物件的基礎 – 圖例 「物件」(Objects)是物件導向技術的關鍵,以程式角度來說,物件是資料與相關程序與函數結合在一起的組合體,資料就是變數;程序和函數在Java語言稱為方法(Methods),如下圖所示:

20 4-2-1 物件的基礎 – 特性 在現實生活中的物件範例隨處可見,例如:車子、電視、書桌和貓狗等,這些物件擁有三種特性,如下所示:
狀態(State):物件擁有「屬性」(Attributes、Fields或Properties)的目前狀態值,屬性是儲存物件的狀態,可以簡單的只是一個布林值變數,也可能是另一個物件,例如:車子的車型、排氣量、色彩和自排或手排等屬性。 行為(Behavior):行為是物件可見部分提供的服務,可以作什麼事,例如:車子可以發動、停車、加速和換擋等。 識別字(Identity):識別字是用來識別不同的物件,每一個物件都擁有獨一無二的識別字,Java語言是使用物件參考(Reference)作為物件的識別字,簡單的說,就是物件實際儲存的記憶體位址,即物件變數值。

21 4-2-2 Java的類別與物件 – 說明 Java類別宣告是物件的原型宣告,對於物件原型宣告的類別可以分為2個部分,如下所示:
成員資料(Data Member):物件的資料部分,屬於基本資料型態的變數、常數或其他物件的「成員變數」(Member Variables)。 成員方法(Method Member):物件的操作部分,即程式與函數,也就是Java方法。

22 4-2-2 Java的類別與物件 – 宣告類別1 class Customer { private String name;
private String address; public int age; // 建構子 public Customer(String name, String a) { this.name = name; address = a; }

23 4-2-2 Java的類別與物件 – 宣告類別2 // 方法: 傳回姓名
public String getName(){ return name; } // 方法: 傳回月份 public String getAddress(){ return address; } // 方法: 傳回郵寄資料 public String getLabelData() { String str = ""; str += "\n姓名: " + name; ….. return str; }

24 4-2-2 Java的類別與物件 – 存取修飾子 private修飾子:成員變數或成員方法只能在類別本身呼叫或存取。
public修飾子:類別建立物件的對外使用介面,可以讓其他類別的程式碼呼叫物件宣告成public的方法或存取public的成員變數。 protected修飾子:宣告的成員方法或變數可以在同一類別、其子類別或同一個套件存取,存取權限介於public和private之間。

25 4-2-2 Java的類別與物件 – 建構子 建構子是物件的初始方法,這是與Java類別同名的方法,其程式碼的撰寫方式和其他成員方法相同,類別是呼叫此方法來建立物件和指定初值。類別建構子有一些特點,如下所示: 建構子與類別同名,例如:類別Customer的建構子方法是Customer()。 建構子沒有傳回值,不過也不用指明void。 建構子支援方法的「過載」(Overload),簡單的說,就是擁有多個同名的建構子,只是擁有不同參數型態和參數個數。

26 4-2-2 Java的類別與物件 – this 如果在Customer()建構子的參數與成員變數同名,我們需要使用this關鍵字指明是類別的成員變數,而不是參數,如下所示: this.name = name;

27 4-2-2 Java的類別與物件 – 宣告物件變數 在Java程式碼宣告類別後,就可以將類別當作資料型態,使用資料型態宣告物件變數,如下所示: Customer joe; 程式碼宣告Customer類別的變數joe,稱為物件變數,這是因為變數內容是參考的指標,這個指標就是物件的識別字(Identity),目前只有宣告物件變數,並沒有真正建立物件。

28 4-2-2 Java的類別與物件 – 建立物件實例 在Java語言建立物件是使用new運算子,它可以依照類別的範本來建立物件,傳回指向此物件的參考指標,這個過程稱為「實體化」(Instantiation),將類別實體化成物件實例,如下所示: joe = new Customer("陳會安","新北巿"); 程式碼建立Customer類別的物件,物件變數joe的值不是物件本身,而是參考到此物件的指標。

29 4-2-2 Java的類別與物件–存取物件變數與方法
在建立物件後,我們就可以存取物件的變數與呼叫方法,以Customer類別建立的joe物件為例,如下所示: joe.age = 37; str += joe.getLabelData(); 上述物件變數joe使用「.」運算子存取物件變數與呼叫方法,在其他類別只能存取宣告成public修飾子的成員變數和方法,即age成員變數,而不能存取name和address變數(只能在類別宣告內存取)。

30 4-2-3 過載方法與串流呼叫方法 – 過載 物件是依接收的訊息(Message)來執行不同的方法,換句話說,只需訊息有差異足以讓物件辨識,就算方法名稱相同,也一樣可以讓類別或物件執行正確的方法。 例如:在Counter類別的2個同名方法count(),可以將計數加上參數值,如下所示: public Counter count(double num) public Counter count(int num) 2個方法雖然名稱相同,但是參數的資料型態不同,足以使用資料型態來判斷是2個不同方法。接著是參數個數不同的總和方法sum(),如下所示: int sum(int a, int b) int sum(int a, int b, int c)

31 4-2-3 過載方法與串流呼叫方法 – 串流呼叫 因為前述2個count()過載方法的傳回值都是Counter物件,如下所示:
public Counter count(double num) { count += num; return this; } 方法傳回值是this關鍵字,即Counter物件本身,我們可以直接使用「串流呼叫方法」(Method Chaining),如同項鍊的一串珠子一般依序呼叫各方法,如下所示: int count = c.count(2).count(3.0).getCount();

32 4-2-4 靜態成員與靜態初始程式區塊 – 類別變數和方法
4-2-4 靜態成員與靜態初始程式區塊 – 類別變數和方法 類別變數和方法是使用static修飾子進行宣告,屬於類別的靜態成員,所有物件都是使用同一份類別變數和呼叫同一個類別方法,例如:Student類別擁有類別變數teacherNo、count和類別方法getStudentCount(),如下所示: class Student { public static int teacherNo = 500; private static int count; ………… public static int getStudentCount() { return count; } ……….. }

33 4-2-4 靜態成員與靜態初始程式區塊 – 靜態初始程式區塊static {}
在靜態初始程式區塊的程式碼是在類別載入JVM後,進行類別變數初始化之前執行,一般來說,只有當類別需要使用一些非Java函數庫的類別時才會使用,因為只有當類別第一次被使用到時,才會執行靜態初始程式區塊的程式碼,可以避免重複執行這些程式碼,並且將實作細節和外界隔離開,如下所示: public class a { static { }

34 4-3 類別的繼承 4-3-1 類別架構 - 繼承 4-3-2 實作類別的繼承

35 4-3 類別的繼承 「繼承」(Inheritance)是物件導向程式設計的重要觀念,繼承是宣告的類別繼承現存類別的部分或全部的成員資料和方法、新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法或資料。 簡單的說,繼承就是擴充現存類別的功能,可以讓我們不用重頭建立類別宣告,只需找到可用的現成類別,然後繼承它來擴充或修改成符合我們需求的類別。本節Android Studio專案是Ch4_3,內含Vehicle.java和Car.java二個類別檔。

36 4-3-1 類別架構 - 繼承1 類別的繼承關係可以讓我們建立類別架構,例如:類別Student是繼承自類別Person,其類別架構如下圖所示:

37 4-3-1 類別架構 - 繼承2 繼承不只可以多個子類別繼承同一個父類別,還可以擁有很多層的繼承,如右圖所示:

38 4-3-2 實作類別的繼承 – 父類別 在Java宣告繼承類別前,需要先有一個父類別來繼承,例如:父類別Vehicle定義車輛的基本資料,其類別宣告如下所示: class Vehicle { private string name; private double price; public Vehicle(String name, double price) { … } public String getVehicleInfo() { … } }

39 4-3-2 實作類別的繼承 – 子類別 現在我們可以宣告類別繼承存在的Vehicle類別,例如:轎車Car類別的宣告,如下所示:
class Car extends Vehicle { private int doors; public Car(String name, double price, int doors) { … } public String getCarInfo() { … } }

40 4-3-2 實作類別的繼承 – 覆寫和隱藏 如果父類別的成員方法不符合子類別的需求,我們可以在子類別宣告同名、同參數列和傳回值的方法來取代父類別的方法,稱為「覆寫」(Override)。 不過,實例方法並不能取代類別方法(宣告成static的方法),如果父類別擁有類別方法,子類別需要宣告同樣的類別方法來取代它,稱為「隱藏」(Hide)。

41 4-4 巢狀類別與匿名內層類別 - 巢狀類別 巢狀類別強調類別之間的關係,強調外層類別一定需要內層類別,如果內層類別的物件不存在,外層類別物件也不會存在。 巢狀類別的成員類別稱為「內層類別」(Inner Classes),例如:Order巢狀類別,其類別宣告如下所示: class Order { // Order外層類別 ………… class OrderStatus { // OrderStatus內層類別 …………… } Order類別擁有成員類別OrderStatus的內層類別,Order是巢狀類別的「外層類別」(Enclosing Class)。

42 4-4 巢狀類別與匿名內層類別 – 匿名內層類別(說明)
Java內層類別如果沒有命名,稱為「匿名內層類別」(Anonymous Inner Classes),簡單的說,因為我們並沒有使用class關鍵字宣告類別名稱,所以稱為匿名,通常它是使用在Java的Swing;Android介面元件的事件處理,用來簡化複雜的事件處理程式碼。 一般來說,匿名內層類別的使用方式和命名的內層類別相似,不過,匿名內層類別不能宣告新類別,它必須繼承存在的類別,籍由繼承來定義內層類別,和建立此繼承類別的物件。

43 4-4 巢狀類別與匿名內層類別 – 匿名內層類別(範例)
匿名內層類別,如下所示: result = ( new MyInt(100) { public String getResult() { return "整數值: " + value; } }).getResult(); MyInt是存在的類別,在括號「(」和「)」間使用new運算子建立匿名內層類別繼承MyInt類別來建立物件,並且覆寫getResult()方法(因為MyInt類別擁有同名方法)來顯示成員變數value的值,因為已經建立物件,所以可以馬上呼叫getResult()方法。

44 4-5 常數類別與抽象類別 4-5-1 常數類別與方法 4-5-2 抽象類別與方法

45 4-5-1 常數類別與方法 Java類別宣告成final表示類別不能被繼承,方法宣告成final表示方法不允許覆寫,例如:繼承父類別Person的Student類別,如下所示: final class Student extends Person { } final宣告表示Student類別不能再有子類別,在Person類別的某些方法宣告成final,表示子類別Student不允許覆寫這些方法,如下所示: class Person { ……… final char getName() { return name; } final int getAge() { return age; } final void setName(char c) { name = c; } final void setAge(int age) { this.age = age; } }

46 4-5-2 抽象類別與方法 – 說明 「抽象類別」(Abstract Class)是一種不能完全代表物件的類別,換句話說,它並不能建立物件,其主要目是作為類別繼承的父類別,用來定義一些類別的共同部分。 Java類別宣告成abstract表示是抽象類別,抽象類別並不能用來建立物件,只能繼承抽象類別來建立子類別。在抽象類別同時可以使用abstract宣告方法為抽象方法,表示方法只有原型宣告,實作程式碼是在子類別建立,而且繼承的子類別「一定要」實作這些抽象方法。

47 4-5-2 抽象類別與方法 – 宣告抽象類別 抽象類別是子類別的原型宣告,抽象方法宣告子類別使用介面的方法,如果類別擁有抽象方法,表示類別一定是一個抽象類別。例如:抽象類別Shape,如下所示: abstract class Shape { public double x; public double y; abstract double area(); }

48 4-5-2 抽象類別與方法 – 繼承抽象類別 宣告Circle類別繼承Shape類別,如下所示:
class Circle extends Shape { public double r; public Circle(double x, double y, double r) { … } public double area() { return *r*r; } } 子類別Circle定義圓形,除圓心座標外,新增成員變數半徑r,並且實作area()方法計算圓面積。

49 4-6 介面與套件 4-6-1 Java的介面 4-6-2 實作介面的匿名內層類別 4-6-3 匿名內層類別與this與final關鍵字
4-6-4 套件

50 4-6-1 Java的介面 - 宣告介面 Java語言的介面(Interface)是在類別繼承架構中定義類別的行為,內含常數和方法宣告,但是沒有實作程式碼。 Java介面和類別一樣都屬於參考資料型態,這是一種介面資料型態,介面宣告的方法屬於抽象方法,在實作介面的類別需要實作「所有」抽象方法,如下所示: interface AreaInterface { final double PI = ; double area(); } 介面宣告使用interface關鍵字,類似類別架構,只是宣告的內容是常數和抽象方法(表示尚未實作)。介面的內容是一些常數和方法宣告。

51 4-6-1 Java的介面 - 實作介面 類別宣告可以實作一個或多個介面,在AreaInterface介面擁有常數PI和方法area(),例如:Circle類別實作此介面,如下所示: class Circle extends Shape implements AreaInterface { ……… public double area() { return PI*r*r; } 如果實作介面不只一個,請使用「,」逗號分隔,在類別宣告內需要實作介面宣告的方法,也就是area()方法。

52 4-6-2 實作介面的匿名內層類別 – 語法 匿名內層類別可以繼承現存類別,也可以實作介面來建立物件,其基本語法如下所示: 或:
new 類別名稱( [ 參數列 ] ) { … } 或: new 介面名稱() { … } 實作介面的匿名內層類別隱含建立一個匿名類別(不是繼承的子類別)來實作介面。

53 4-6-2 實作介面的匿名內層類別 – 寫法1 例如:Android SDK的Button按鈕元件,Click事件可以建立匿名內層類別實作OnClickListener介面方法來處理,如下所示: View.OnClickListener btn1Listener = new View.OnClickListener() { public void onClick(View v) { } }; onClick()方法是實作OnClickListener介面的介面方法,並且將匿名內層類別建立的物件指定給物件變數btn1Listener。

54 4-6-2 實作介面的匿名內層類別 – 寫法2 當然,我們也可以直接在setOnClickListener()方法中建立實作介面的匿名內層類別,此時連物件變數都可以省略,如下所示: imgBtn1.setOnClickListener( new View.OnClickListener(){ public void onClick(View v) { } });

55 4-6-3 匿名內層類別與this與final關鍵字 – this
View.OnClickListener btn1Listener = new View.OnClickListener() { public void onClick(View v) { Toast.makeText(Ch6_3_1Activity.this, Integer.toString(num1), Toast.LENGTH_SHORT).show(); } }; Toast類別的makeText()方法是顯示在外層Activity類別,所以第1個參數是Ch6_3_1Activity.this,而不是this。

56 4-6-3 匿名內層類別與this與final關鍵字 – final
在Activity類別的onCreate()方法建立匿名內層類別,而且需要存取onCreate()方法宣告的物件變數output,我們需要使用final關鍵字宣告物件變數,如下所示: imgBtn1= (ImageButton)findViewById(R.id.imgBtn1); final TextView output = (TextView) findViewById(R.id.output); imgBtn1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { output.setText(Integer.toString(num1); } }); final關鍵字表示TextView物件參考不能更改,只能使用setText()方法更改顯示的內容。

57 4-6-4 套件 – 說明 「套件」(Packages)是一組相關類別和介面的集合,提供存取保護,可以讓其他類別使用套件中的類別和介面。
簡單的說,套件是物件導向程式設計的零件庫,程式開發者可以直接選用套件中現成零件的各種類別來建立物件,輕鬆組合零件來建立物件集合,即可完成整個應用程式的開發。

58 4-6-4 套件 – 範例 Java套件的架構類似Windows作業系統的資料夾架構,只是改為「.」句點分隔,Ch4_6專案的套件為例,如右圖所示:

59 4-6-4 套件 – 建立套件:package指令敘述
Java套件是以資料夾為單位,我們可以將資料夾中儲存的類別檔案建立成套件,此時,每一個欲組成套件的Java程式檔案前,需要加上package指令敘述,例如:MainActivity.java,如下所示: package com.example.hueyan.ch4_6; …... public class MainActivity extends ActionBarActivity { }

60 4-6-4 套件 – 匯入套件的類別:import指令敘述
當我們將資料夾的類別和介面檔案建立成套件後,或擁有其他現成的類別函數庫,例如:Android SDK,Java程式可以直接使用套件中的類別,只需使用import指令敘述來匯入套件中的類別,如下所示: import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView;

61 4-7 執行緒 4-7-1 Java執行緒 4-7-2 繼承Thread類別來建立執行緒

62 4-7-1 Java執行緒 – 說明 「執行緒」(Threads)就是包含在Java程式中的小程式,能夠讓多個同步執行緒一起執行來提昇程式的執行效率。 Java執行緒(Threads)也稱為「輕量行程」(Lightweight Process),其執行過程類似一般的程式執行,不過,執行緒不能單獨存在或獨立執行,它一定需要隸屬於一個程式,由程式來啟動執行緒。

63 4-7-1 Java執行緒 – 平行程式設計 如果程式碼本身沒有先後依存的關係。例如:因為b()方法需要使用到a()方法的執行結果,需要在執行完a()方法後,才能執行b()方法,所以a()方法和b()方法並不能同時執行,也就無法使用2個執行緒來同步執行。 若程式能夠分割成多個同步執行緒來一起執行,這種程式設計方法稱為「平行程式設計」(Parallel Programming),如右圖所示:

64 4-7-1 Java執行緒 – 建立Java的執行緒
Java執行緒就是建立Thread類別的物件,我們可以使用兩種方式來建立多執行緒的應用程式,如下所示: 實作Runnable介面的run()方法。 繼承Thread類別覆寫run()方法。

65 實作 Runnable 介面的run()方法
Class UserThread implements Runnable { public UserThread(int length){} Public void run(){….} } UserThread utl = new UserThread(5); Thread t1 = new Thread(utl, “執行緒A”); t1.start();

66 4-7-2 繼承Thread類別來建立執行緒 – 繼承Thread類別來建立執行緒
Java類別如果沒有繼承其他類別,我們可以直接繼承Thread類別覆寫run()方法來建立執行緒。SumThread類別是一個繼承Thread的類別,其宣告如下所示: class SumThread extends Thread { public SumThread(long length, String name) { … } public void run() { … } } 現在我們可以建立Thread物件來啟動執行緒,如下所示: SumThread st = new SumThread(150, "執行緒A"); st.start();

67 4-7-2 繼承Thread類別來建立執行緒 – 使用匿名內層類別啟動執行緒
另一種方式是使用匿名內層類別來啟動執行緒,如下所示: new Thread("執行緒B") { int length = 150; public void run() { // 計算總和 } }.start(); 上述程式碼使用匿名內層類別建立Thread物件後,直接呼叫start()方法來啟動執行緒。

68 4-8 集合物件與泛型 4-8-1 泛型 4-8-2 ArrayList類別 4-8-3 Iterator介面輸出元素

69 4-8-1 泛型 「泛型」(Generic)新增編譯階段的集合物件型態檢查功能,可以減少程式碼中取出元素所需的大量型態轉換。
泛型可以使用「泛型型態」(Generic Types)來擴充Java語言,簡單的說,就是在建立集合物件時,使用泛型型態來指定集合物件儲存元素的資料型態,如下所示: ArrayList<Byte> alist = new ArrayList<>(); ArrayList<Float> alist = new ArrayList<>(); ArrayList<String> alist = new ArrayList<>(); 上述程式碼在ArrayList類別之後,使用「<」和「>」括起的資料型態就是泛型型態,用來指定集合物件儲存元素的資料型態,以便編譯程式可以自行追蹤記錄元素的資料型態,所以,在Java程式取出元素時,就不需自行使用程式碼來執行型態轉換。

70 4-8-2 ArrayList類別-建立泛型ArrayList物件
ArrayList類別實作List介面,儲存元素的方式類似陣列,元素使用索引位置依序存入,只需將元素新增或插入ArrayList物件,並不用事先宣告物件的尺寸,它如同是一個可自動調整陣列尺寸的動態陣列。 在Java程式建立泛型ArrayList物件,如下所示: ArrayList<String> alist = new ArrayList<>(); 上述程式碼使用建構子建立ArrayList物件儲存字串元素,泛型型態是String。

71 4-8-2 ArrayList類別-使用foreach迴圈走訪元素
在新增ArrayList物件的元素後,Java程式可以使用foreach迴圈取得集合物件或陣列的每一個元素,如下所示: int i = 0; for (String ele : alist) { str += " " + i + ":" + ele; i++; } foreach迴圈的ele是取得的每一個元素,在「:」符號後是集合物件或陣列,可以依序取得每一個元素指定給ele,直到沒有元素為止。

72 4-8-3 Iterator介面輸出元素 Iterator介面提供一致方法來走訪集合物件的元素或刪除元素,因為Collections集合物件已經實作Iterator介面,所以,我們只需使用Collection、Set和List介面的iterator()方法,就可以取得Iterator<E>介面的物件,例如:ArrayList<String>物件alist可以使用上表方法取得Iterator介面物件,如下所示: Iterator<String> iterator = alist.iterator(); 上述程式碼是將ArrayList物件的元素轉換成Iterator<E>介面物件,泛型型態為String,現在我們只需呼叫此介面的方法,就可以依序走訪和刪除元素。

73 End


Download ppt "第4章 XML與Java物件導向程式設計 4-1 XML的基礎 4-2 類別與物件 4-3 類別的繼承 4-4 巢狀類別與匿名內層類別"

Similar presentations


Ads by Google