《【教学课件】第4章XML与Java物件导向程式设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章XML与Java物件导向程式设计.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章 XML與與Java物件導向程式設計物件導向程式設計n4-1 XML的基礎 n4-2 類別與物件n4-3 類別的繼承n4-4 巢狀類別與匿名內層類別n4-5 常數類別與抽象類別n4-6 介面與套件n4-7 執行緒n4-8 集合物件與泛型4-1 XML的基礎的基礎 n4-1 XML的基礎 n4-1-2 XML文件的內容 n4-1-3 XML文件的組成元素 n4-1-4 XML文件的命名空間 4-1 XML的基礎的基礎nXML(Extensible Markup Language)是W3C建議規格的標示語言(Markup Language),可以讓使用者建立特殊用途的標示語言來建立所需的
2、XML文件(XML Documents),例如:定義Android應用程式資源的XML檔案。4-1-1 標示語言的基礎標示語言的基礎 說明說明nXML和HTML都是一種標示語言(Markup Language),標示(Markup)是一種方法讓資料擁有描述資料本身的資訊。例如:在讀書時,我們常常使用黃色螢光筆在書中的某些句子作上記號,因為這些句子是考前複習的重點。n當我們在書中的某些句子劃上黃色螢光線時,就是在標示資料,表示這些句子的資料很重要。簡單的說,我們使用黃色螢光筆替句子加上描述資訊,描述這些句子是考試重點。當我們在進行標示操作時,需要注意兩件事,如下所示:標示方法:定義如何標示是合法
3、標示,以此例是劃上黃色螢光線。標示的意義:標示代表的意義,以此例是代表考試重點。4-1-1 標示語言的基礎標示語言的基礎 範例範例n對於電子檔案的文件來說,標示文件資料就是使用標示語言,標示語言通常是使用標籤(Tags)的標示方法來標示資料,標籤名稱代表標示的意義,如下所示:陳會安n上述符號括起的是標籤,標示資料【陳會安】,標籤名稱author表示標示的資料是作者。當文件使用標示語言處理後,文件除了內容外,還包含描述資料的標籤。4-1-2 XML文件的文件的內內容容 定義定義內內容(容(Defining Content)n一般文件內容的主要目的是用來顯示或列印資料,但是XML文件的內容需要定義
4、其意義。例如:筆者姓名【陳會安】對於電腦來說只是一串字元組成的字串,其意義需視閱讀者而定,如下所示:在本書是作者。在Web網站是管理者。在公司是程式設計師。在家中是爸媽的兒子。n在XML可以使用、和標籤來定義文件的內容,如下所示:陳會安陳會安陳會安陳會安4-1-2 XML文件的文件的內內容容 結構資訊(結構資訊(Structured Information)1n當定義XML文件的內容後,事實上,我們就是在建立結構資訊,結構資訊除了告訴電腦顯示資料外,還包含資料本身的描述資料,稱為Metadata中繼資料。n例如:XML文件除了告訴應用程式筆者的姓名資料外,還提供結構資訊的作者author、網站
5、管理者webmaster、程式設計者programming和兒子son,這是描述姓名資料的Metadata資料。4-1-2 XML文件的文件的內內容容 結構資訊(結構資訊(Structured Information)2n結構資訊不僅可以提供XML元素的自我描述能力,我們還可以從結構資訊建立出資料的樹狀結構,例如:一本圖書的內容,如下所示:F1772 Android SDK床程式設計範例教本 陳會安 6204-1-3 XML文件的組成元素文件的組成元素 PInPI(Processing Instructions)允許XML文件包含傳送給應用程式的指令。PI的基本格式是以字串結束,如下所示:n上
6、述name是PI目標(PI Target)名稱,其中xml和XML是保留給XML使用,名稱是一個PI識別字,應用程式可以依照此名稱處理所需的PI,而不處理其他PI。例如:XML文件開頭宣告就是PI,這些資訊是告訴XML剖析器如何處理XML文件,如下所示:n上述PI並不屬於XML文件內容,version是XML版本,encoding是文件內容的編碼,Android是使用utf-8編碼。4-1-3 XML文件的組成元素文件的組成元素 元素元素(組成組成)nXML文件是由元素(Elements)組成,XML元素和標籤不同,其意義如下所示:標籤(Tags):XML能夠自己定義標籤,一個標籤是標示文件的
7、部分內容。例如:標籤、和等,標籤分為開始標籤和結尾標籤。元素(Elements):XML元素是整個文件的主要架構,元素是標籤加上其中的文字內容,或在元素中包含其他元素,基本上,元素是一個完整項目,包含標籤、屬性、開始標籤、標籤內的文字內容和結尾標籤。4-1-3 XML文件的組成元素文件的組成元素 元素元素(範例範例)nXML元素需要由開始和結尾標籤構成,在其中包含文字內容。例如:XML元素color,包含值#800F,如下所示:#800Fn在XML元素還允許包含其他子元素。例如:在resource元素擁有string-array子元素,string-array元素擁有item子元素,如下所示:
8、白色 黑色 藍色 紅色 黃色 綠色 4-1-3 XML文件的組成元素文件的組成元素 元素元素(空元素標籤空元素標籤)n如果在開始和結尾標籤之中沒有任何內容,稱為空元素標籤,其語法有兩種,如下所示:n上述兩種寫法都是空元素標籤,如果空元素標籤沒有結尾標籤,標籤需要使用/符號結束,例如:標籤,如下所示:4-1-3 XML文件的組成元素文件的組成元素 屬性屬性nXML屬性可以替XML元素新增一些額外的資訊,屬性是位在開始標籤的標籤名稱之後,這是一個屬性(Attributes)清單,每一個屬性擁有屬性名稱和值,屬性值需要使用引號括起,Android是使用雙引號,如下所示:#800Fn上述標籤擁有nam
9、e屬性,其值為background_color。4-1-4 XML文件的命名空間文件的命名空間 說明說明n因為XML元素和屬性名稱都是使用者自行命名,對於愈來愈多各種不同公司、組織或個人建立的XML文件,當XML文件引用其他XML文件的架構或元素時,就有可能產生名稱重複的問題。nXML命名空間(Namespace)可以解決與其他公司進行XML資料交換時,避免標籤或屬性名稱重複的問題。4-1-4 XML文件的命名空間文件的命名空間 XML標籤的完整名稱標籤的完整名稱nXML標籤和屬性的完整名稱需要加上命名空間的字首,如下所示:n上述標籤名稱在:符號前是命名空間的字首(Prefix),可以將它視為
10、是代替命名空間字串URI(Uniform Resource Identifier)的一個縮寫。n在:符號之後才是我們命名的標籤名稱。換句話說,同一份XML文件,就算之後的標籤名稱相同,只要命名空間不同,XML剖析器一樣可以分辨出是屬於不同的標籤,如下所示:4-1-4 XML文件的命名空間文件的命名空間 在在Android的的XML檔使用的命名空間檔使用的命名空間n在Android專案定義資源是使用XML文件內容的檔案,其根元素需要宣告命名空間來識別是Android系統的屬性,例如:宣告使用介面的XML檔activity_main.xml,其內容如下所示:4-2 類別與物件類別與物件 n4-2-
11、1 物件的基礎 n4-2-2 Java的類別與物件 n4-2-3 過載方法與串流呼叫方法 n4-2-4 靜態成員與靜態初始程式區塊 4-2 類別與物件類別與物件n物件導向程式設計(Object-oriented Programming,OOP)是一種更符合人性化的程式設計方法,因為我們本來就生活在一個物件的世界,思考模式也導循著物件導向模式。n物件導向技術有三個重要觀念:物件(Object)、訊息(Message)和類別(Class),其簡單說明如下所示:物件:提供資料和方法的封裝。訊息:物件之間的溝通方式,可以建立互動和支援過過載和多形觀念。類別:物件的分類,可以實作類別架構的繼承。4-2-
12、1 物件的基礎物件的基礎 圖例圖例n物件(Objects)是物件導向技術的關鍵,以程式角度來說,物件是資料與相關程序與函數結合在一起的組合體,資料就是變數;程序和函數在Java語言稱為方法(Methods),如下圖所示:4-2-1 物件的基礎物件的基礎 特性特性n在現實生活中的物件範例隨處可見,例如:車子、電視、書桌和貓狗等,這些物件擁有三種特性,如下所示:狀態(State):物件擁有屬性(Attributes、Fields或Properties)的目前狀態值,屬性是儲存物件的狀態,可以簡單的只是一個布林值變數,也可能是另一個物件,例如:車子的車型、排氣量、色彩和自排或手排等屬性。行為(Beh
13、avior):行為是物件可見部分提供的服務,可以作什麼事,例如:車子可以發動、停車、加速和換擋等。識別字(Identity):識別字是用來識別不同的物件,每一個物件都擁有獨一無二的識別字,Java語言是使用物件參考(Reference)作為物件的識別字,簡單的說,就是物件實際儲存的記憶體位址,即物件變數值。4-2-2 Java的類別與物件的類別與物件 說明說明nJava類別宣告是物件的原型宣告,對於物件原型宣告的類別可以分為2個部分,如下所示:成員資料(Data Member):物件的資料部分,屬於基本資料型態的變數、常數或其他物件的成員變數(Member Variables)。成員方法(Me
14、thod Member):物件的操作部分,即程式與函數,也就是Java方法。4-2-2 Java的類別與物件的類別與物件 宣告類別宣告類別1class Customer private String name;private String address;public int age;/建構子 public Customer(String name,String a)this.name=name;address=a;4-2-2 Java的類別與物件的類別與物件 宣告類別宣告類別2 /方法:傳回姓名 public String getName()return name;/方法:傳回月份 publ
15、ic String getAddress()return address;/方法:傳回郵寄資料 public String getLabelData()String str=;str+=n姓名:+name;.return str;4-2-2 Java的類別與物件的類別與物件 存取修飾子存取修飾子nprivate修飾子:成員變數或成員方法只能在類別本身呼叫或存取。npublic修飾子:類別建立物件的對外使用介面,可以讓其他類別的程式碼呼叫物件宣告成public的方法或存取public的成員變數。nprotected修飾子:宣告的成員方法或變數可以在同一類別、其子類別或同一個套件存取,存取權限介於
16、public和private之間。4-2-2 Java的類別與物件的類別與物件 建構子建構子n建構子是物件的初始方法,這是與Java類別同名的方法,其程式碼的撰寫方式和其他成員方法相同,類別是呼叫此方法來建立物件和指定初值。類別建構子有一些特點,如下所示:建構子與類別同名,例如:類別Customer的建構子方法是Customer()。建構子沒有傳回值,不過也不用指明void。建構子支援方法的過載(Overload),簡單的說,就是擁有多個同名的建構子,只是擁有不同參數型態和參數個數。4-2-2 Java的類別與物件的類別與物件 thisn如果在Customer()建構子的參數與成員變數同名,我
17、們需要使用this關鍵字指明是類別的成員變數,而不是參數,如下所示:this.name=name;4-2-2 Java的類別與物件的類別與物件 宣告物件變數宣告物件變數n在Java程式碼宣告類別後,就可以將類別當作資料型態,使用資料型態宣告物件變數,如下所示:Customer joe;n程式碼宣告Customer類別的變數joe,稱為物件變數,這是因為變數內容是參考的指標,這個指標就是物件的識別字(Identity),目前只有宣告物件變數,並沒有真正建立物件。4-2-2 Java的類別與物件的類別與物件 建立物件實例建立物件實例n在Java語言建立物件是使用new運算子,它可以依照類別的範本來
18、建立物件,傳回指向此物件的參考指標,這個過程稱為實體化(Instantiation),將類別實體化成物件實例,如下所示:joe=new Customer(陳會安,新北巿);n程式碼建立Customer類別的物件,物件變數joe的值不是物件本身,而是參考到此物件的指標。4-2-2 Java的類別與物件的類別與物件存取物件變數與方法存取物件變數與方法n在建立物件後,我們就可以存取物件的變數與呼叫方法,以Customer類別建立的joe物件為例,如下所示:joe.age=37;str+=joe.getLabelData();n上述物件變數joe使用.運算子存取物件變數與呼叫方法,在其他類別只能存取宣
19、告成public修飾子的成員變數和方法,即age成員變數,而不能存取name和address變數(只能在類別宣告內存取)。4-2-3 過載方法與串流呼叫方法過載方法與串流呼叫方法 過載過載n物件是依接收的訊息(Message)來執行不同的方法,換句話說,只需訊息有差異足以讓物件辨識,就算方法名稱相同,也一樣可以讓類別或物件執行正確的方法。n例如:在Counter類別的2個同名方法count(),可以將計數加上參數值,如下所示:public Counter count(double num)public Counter count(int num)n2個方法雖然名稱相同,但是參數的資料型態不同,
20、足以使用資料型態來判斷是2個不同方法。接著是參數個數不同的總和方法sum(),如下所示:int sum(int a,int b)int sum(int a,int b,int c)4-2-3 過載方法與串流呼叫方法過載方法與串流呼叫方法 串流呼叫串流呼叫n因為前述2個count()過載方法的傳回值都是Counter物件,如下所示:public Counter count(double num)count+=num;return this;n方法傳回值是this關鍵字,即Counter物件本身,我們可以直接使用串流呼叫方法(Method Chaining),如同項鍊的一串珠子一般依序呼叫各方法,
21、如下所示:int count=c.count(2).count(3.0).getCount();4-2-4 靜態成員與靜態初始程式區塊靜態成員與靜態初始程式區塊 類別變數和方法類別變數和方法n類別變數和方法是使用static修飾子進行宣告,屬於類別的靜態成員,所有物件都是使用同一份類別變數和呼叫同一個類別方法,例如:Student類別擁有類別變數teacherNo、count和類別方法getStudentCount(),如下所示:class Student public static int teacherNo=500;private static int count;public stati
22、c int getStudentCount()return count;.4-2-4 靜態成員與靜態初始程式區塊靜態成員與靜態初始程式區塊 靜態初始程式區塊靜態初始程式區塊static n在靜態初始程式區塊的程式碼是在類別載入JVM後,進行類別變數初始化之前執行,一般來說,只有當類別需要使用一些非Java函數庫的類別時才會使用,因為只有當類別第一次被使用到時,才會執行靜態初始程式區塊的程式碼,可以避免重複執行這些程式碼,並且將實作細節和外界隔離開,如下所示:public class a static 4-3 類別的繼承類別的繼承 n4-3-1 類別架構-繼承 n4-3-2 實作類別的繼承 4-
23、3 類別的繼承類別的繼承n繼承(Inheritance)是物件導向程式設計的重要觀念,繼承是宣告的類別繼承現存類別的部分或全部的成員資料和方法、新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法或資料。n簡單的說,繼承就是擴充現存類別的功能,可以讓我們不用重頭建立類別宣告,只需找到可用的現成類別,然後繼承它來擴充或修改成符合我們需求的類別。本節Android Studio專案是Ch4_3,內含Vehicle.java和Car.java二個類別檔。4-3-1 類別架構類別架構-繼承繼承1n類別的繼承關係可以讓我們建立類別架構,例如:類別Student是繼承自類別Person,其類別架構如下圖所示
24、:4-3-1 類別架構類別架構-繼承繼承2n繼承不只可以多個子類別繼承同一個父類別,還可以擁有很多層的繼承,如右圖所示:4-3-2 實作類別的繼承實作類別的繼承 父類別父類別n在Java宣告繼承類別前,需要先有一個父類別來繼承,例如:父類別Vehicle定義車輛的基本資料,其類別宣告如下所示:class Vehicle private string name;private double price;public Vehicle(String name,double price)public String getVehicleInfo()4-3-2 實作類別的繼承實作類別的繼承 子類別子類別n
25、現在我們可以宣告類別繼承存在的Vehicle類別,例如:轎車Car類別的宣告,如下所示:class Car extends Vehicle private int doors;public Car(String name,double price,int doors)public String getCarInfo()4-3-2 實作類別的繼承實作類別的繼承 覆寫和隱藏覆寫和隱藏n如果父類別的成員方法不符合子類別的需求,我們可以在子類別宣告同名、同參數列和傳回值的方法來取代父類別的方法,稱為覆寫(Override)。n不過,實例方法並不能取代類別方法(宣告成static的方法),如果父類別擁有
26、類別方法,子類別需要宣告同樣的類別方法來取代它,稱為隱藏(Hide)。4-4 巢狀類別與匿名內層類別巢狀類別與匿名內層類別-巢狀類別巢狀類別n巢狀類別強調類別之間的關係,強調外層類別一定需要內層類別,如果內層類別的物件不存在,外層類別物件也不會存在。n巢狀類別的成員類別稱為內層類別(Inner Classes),例如:Order巢狀類別,其類別宣告如下所示:class Order /Order外層類別 class OrderStatus /OrderStatus內層類別 nOrder類別擁有成員類別OrderStatus的內層類別,Order是巢狀類別的外層類別(Enclosing Class
27、)。4-4 巢狀類別與匿名內層類別巢狀類別與匿名內層類別 匿名內層類別匿名內層類別(說明說明)nJava內層類別如果沒有命名,稱為匿名內層類別(Anonymous Inner Classes),簡單的說,因為我們並沒有使用class關鍵字宣告類別名稱,所以稱為匿名,通常它是使用在Java的Swing;Android介面元件的事件處理,用來簡化複雜的事件處理程式碼。n一般來說,匿名內層類別的使用方式和命名的內層類別相似,不過,匿名內層類別不能宣告新類別,它必須繼承存在的類別,籍由繼承來定義內層類別,和建立此繼承類別的物件。4-4 巢狀類別與匿名內層類別巢狀類別與匿名內層類別 匿名內層類別匿名內層
28、類別(範例範例)n匿名內層類別,如下所示:result=(new MyInt(100)public String getResult()return 整數值:+value;).getResult();nMyInt是存在的類別,在括號(和)間使用new運算子建立匿名內層類別繼承MyInt類別來建立物件,並且覆寫getResult()方法(因為MyInt類別擁有同名方法)來顯示成員變數value的值,因為已經建立物件,所以可以馬上呼叫getResult()方法。4-5 常數類別與抽象類別常數類別與抽象類別 n4-5-1 常數類別與方法 n4-5-2 抽象類別與方法 4-5-1 常數類別與方法常數類
29、別與方法nJava類別宣告成final表示類別不能被繼承,方法宣告成final表示方法不允許覆寫,例如:繼承父類別Person的Student類別,如下所示:final class Student extends Person nfinal宣告表示Student類別不能再有子類別,在Person類別的某些方法宣告成final,表示子類別Student不允許覆寫這些方法,如下所示:class Person final char getName()return name;final int getAge()return age;final void setName(char c)name=c;fi
30、nal void setAge(int age)this.age=age;4-5-2 抽象類別與方法抽象類別與方法 說明說明n抽象類別(Abstract Class)是一種不能完全代表物件的類別,換句話說,它並不能建立物件,其主要目是作為類別繼承的父類別,用來定義一些類別的共同部分。nJava類別宣告成abstract表示是抽象類別,抽象類別並不能用來建立物件,只能繼承抽象類別來建立子類別。在抽象類別同時可以使用abstract宣告方法為抽象方法,表示方法只有原型宣告,實作程式碼是在子類別建立,而且繼承的子類別一定要實作這些抽象方法。4-5-2 抽象類別與方法抽象類別與方法 宣告抽象類別宣告抽
31、象類別n抽象類別是子類別的原型宣告,抽象方法宣告子類別使用介面的方法,如果類別擁有抽象方法,表示類別一定是一個抽象類別。例如:抽象類別Shape,如下所示:abstract class Shape public double x;public double y;abstract double area();4-5-2 抽象類別與方法抽象類別與方法 繼承抽象類別繼承抽象類別n宣告Circle類別繼承Shape類別,如下所示:class Circle extends Shape public double r;public Circle(double x,double y,double r)pub
32、lic double area()return 3.1416*r*r;n子類別Circle定義圓形,除圓心座標外,新增成員變數半徑r,並且實作area()方法計算圓面積。4-6 介面與套件介面與套件 n4-6-1 Java的介面 n4-6-2 實作介面的匿名內層類別 n4-6-3 匿名內層類別與this與final關鍵字 n4-6-4 套件4-6-1 Java的介面的介面-宣告介面宣告介面nJava語言的介面(Interface)是在類別繼承架構中定義類別的行為,內含常數和方法宣告,但是沒有實作程式碼。nJava介面和類別一樣都屬於參考資料型態,這是一種介面資料型態,介面宣告的方法屬於抽象方法
33、,在實作介面的類別需要實作所有抽象方法,如下所示:interface AreaInterface final double PI=3.1415926;double area();n介面宣告使用interface關鍵字,類似類別架構,只是宣告的內容是常數和抽象方法(表示尚未實作)。介面的內容是一些常數和方法宣告。4-6-1 Java的介面的介面-實作介面實作介面n類別宣告可以實作一個或多個介面,在AreaInterface介面擁有常數PI和方法area(),例如:Circle類別實作此介面,如下所示:class Circle extends Shape implements AreaInterf
34、ace public double area()return PI*r*r;n如果實作介面不只一個,請使用,逗號分隔,在類別宣告內需要實作介面宣告的方法,也就是area()方法。4-6-2 實作介面的匿名內層類別實作介面的匿名內層類別 語法語法n匿名內層類別可以繼承現存類別,也可以實作介面來建立物件,其基本語法如下所示:new 類別名稱(參數列 )n或:new 介面名稱()n實作介面的匿名內層類別隱含建立一個匿名類別(不是繼承的子類別)來實作介面。4-6-2 實作介面的匿名內層類別實作介面的匿名內層類別 寫法寫法1n例如:Android SDK的Button按鈕元件,Click事件可以建立匿名
35、內層類別實作OnClickListener介面方法來處理,如下所示:View.OnClickListener btn1Listener=new View.OnClickListener()public void onClick(View v);nonClick()方法是實作OnClickListener介面的介面方法,並且將匿名內層類別建立的物件指定給物件變數btn1Listener。4-6-2 實作介面的匿名內層類別實作介面的匿名內層類別 寫法寫法2n當然,我們也可以直接在setOnClickListener()方法中建立實作介面的匿名內層類別,此時連物件變數都可以省略,如下所示:imgBt
36、n1.setOnClickListener(new View.OnClickListener()public void onClick(View v);4-6-3 匿名內層類別與匿名內層類別與this與與final關鍵字關鍵字 thisnthis關鍵字取得的是最接近類別的物件本身,它只能存取到匿名內層類別建立的物件,如果需要存取外層類別,請加上類別名稱,如下所示:View.OnClickListener btn1Listener=new View.OnClickListener()public void onClick(View v)Toast.makeText(Ch6_3_1Activity
37、.this,Integer.toString(num1),Toast.LENGTH_SHORT).show();nToast類別的makeText()方法是顯示在外層Activity類別,所以第1個參數是Ch6_3_1Activity.this,而不是this。4-6-3 匿名內層類別與匿名內層類別與this與與final關鍵字關鍵字 finaln在Activity類別的onCreate()方法建立匿名內層類別,而且需要存取onCreate()方法宣告的物件變數output,我們需要使用final關鍵字宣告物件變數,如下所示:imgBtn1=(ImageButton)findViewById(
38、R.id.imgBtn1);final TextView output=(TextView);imgBtn1.setOnClickListener(new View.OnClickListener()public void onClick(View v)output.setText(Integer.toString(num1););nfinal關鍵字表示TextView物件參考不能更改,只能使用setText()方法更改顯示的內容。4-6-4 套件套件 說明說明n套件(Packages)是一組相關類別和介面的集合,提供存取保護,可以讓其他類別使用套件中的類別和介面。n簡單的說,套件是物件導向程
39、式設計的零件庫,程式開發者可以直接選用套件中現成零件的各種類別來建立物件,輕鬆組合零件來建立物件集合,即可完成整個應用程式的開發。4-6-4 套件套件 範例範例nJava套件的架構類似Windows作業系統的資料夾架構,只是改為.句點分隔,Ch4_6專案的套件為例,如右圖所示:4-6-4 套件套件 建立套件:建立套件:package指令敘述指令敘述nJava套件是以資料夾為單位,我們可以將資料夾中儲存的類別檔案建立成套件,此時,每一個欲組成套件的Java程式檔案前,需要加上package指令敘述,例如:MainActivity.java,如下所示:package com.example.hue
40、yan.ch4_6;.public class MainActivity extends ActionBarActivity .4-6-4 套件套件 匯入套件的類別:匯入套件的類別:import指令敘述指令敘述n當我們將資料夾的類別和介面檔案建立成套件後,或擁有其他現成的類別函數庫,例如:Android SDK,Java程式可以直接使用套件中的類別,只需使用import指令敘述來匯入套件中的類別,如下所示:import android.support.v7.app.ActionBarActivity;import;import;import;4-7 執行緒執行緒 n4-7-1 Java執行緒
41、n4-7-2 繼承Thread類別來建立執行緒 4-7-1 Java執行緒執行緒 說明說明n執行緒(Threads)就是包含在Java程式中的小程式,能夠讓多個同步執行緒一起執行來提昇程式的執行效率。nJava執行緒(Threads)也稱為輕量行程(Lightweight Process),其執行過程類似一般的程式執行,不過,執行緒不能單獨存在或獨立執行,它一定需要隸屬於一個程式,由程式來啟動執行緒。4-7-1 Java執行緒執行緒 平行程式設計平行程式設計n如果程式碼本身沒有先後依存的關係。例如:因為b()方法需要使用到a()方法的執行結果,需要在執行完a()方法後,才能執行b()方法,所以
42、a()方法和b()方法並不能同時執行,也就無法使用2個執行緒來同步執行。n若程式能夠分割成多個同步執行緒來一起執行,這種程式設計方法稱為平行程式設計(Parallel Programming),如右圖所示:4-7-1 Java執行緒執行緒 建立建立Java的執行緒的執行緒nJava執行緒就是建立Thread類別的物件,我們可以使用兩種方式來建立多執行緒的應用程式,如下所示:實作Runnable介面的run()方法。繼承Thread類別覆寫run()方法。4-7-2 繼承繼承Thread類別來建立執行緒類別來建立執行緒 繼承繼承Thread類別來建立執行緒類別來建立執行緒nJava類別如果沒有繼
43、承其他類別,我們可以直接繼承Thread類別覆寫run()方法來建立執行緒。SumThread類別是一個繼承Thread的類別,其宣告如下所示:class SumThread extends Thread public SumThread(long length,String name)public void run()n現在我們可以建立Thread物件來啟動執行緒,如下所示:SumThread st=new SumThread(150,執行緒A);st.start();4-7-2 繼承繼承Thread類別來建立執行緒類別來建立執行緒 使用匿名內層類別啟動執行緒使用匿名內層類別啟動執行緒n另一
44、種方式是使用匿名內層類別來啟動執行緒,如下所示:new Thread(執行緒B)int length=150;public void run()/計算總和 .start();n上述程式碼使用匿名內層類別建立Thread物件後,直接呼叫start()方法來啟動執行緒。4-8 集合物件與泛型集合物件與泛型 n4-8-1 泛型n4-8-2 ArrayList類別n4-8-3 Iterator介面輸出元素 4-8-1 泛型泛型n泛型(Generic)新增編譯階段的集合物件型態檢查功能,可以減少程式碼中取出元素所需的大量型態轉換。n泛型可以使用泛型型態(Generic Types)來擴充Java語言,簡
45、單的說,就是在建立集合物件時,使用泛型型態來指定集合物件儲存元素的資料型態,如下所示:ArrayList alist=new ArrayList();ArrayList alist=new ArrayList();ArrayList alist=new ArrayList();n上述程式碼在ArrayList類別之後,使用括起的資料型態就是泛型型態,用來指定集合物件儲存元素的資料型態,以便編譯程式可以自行追蹤記錄元素的資料型態,所以,在Java程式取出元素時,就不需自行使用程式碼來執行型態轉換。4-8-2 ArrayList類別類別-建立泛型建立泛型ArrayList物件物件nArrayLis
46、t類別實作List介面,儲存元素的方式類似陣列,元素使用索引位置依序存入,只需將元素新增或插入ArrayList物件,並不用事先宣告物件的尺寸,它如同是一個可自動調整陣列尺寸的動態陣列。n在Java程式建立泛型ArrayList物件,如下所示:ArrayList alist=new ArrayList();n上述程式碼使用建構子建立ArrayList物件儲存字串元素,泛型型態是String。4-8-2 ArrayList類別類別-使用使用foreach迴圈走訪元素迴圈走訪元素n在新增ArrayList物件的元素後,Java程式可以使用foreach迴圈取得集合物件或陣列的每一個元素,如下所示:
47、int i=0;for(String ele:alist)str+=+i+:+ele;i+;nforeach迴圈的ele是取得的每一個元素,在:符號後是集合物件或陣列,可以依序取得每一個元素指定給ele,直到沒有元素為止。4-8-3 Iterator介面輸出元素介面輸出元素nIterator介面提供一致方法來走訪集合物件的元素或刪除元素,因為Collections集合物件已經實作Iterator介面,所以,我們只需使用Collection、Set和List介面的iterator()方法,就可以取得Iterator介面的物件,例如:ArrayList物件alist可以使用上表方法取得Iterator介面物件,如下所示:Iterator iterator=alist.iterator();n上述程式碼是將ArrayList物件的元素轉換成Iterator介面物件,泛型型態為String,現在我們只需呼叫此介面的方法,就可以依序走訪和刪除元素。