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

Slides:



Advertisements
Similar presentations
系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
Advertisements

第三讲 面向对象(上).
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
第6章 類別與物件 – 封裝 6-1 物件導向的基礎 6-2 Java的類別與物件 – 封裝 6-3 類別的建構子
大葉大學 指導教授: 黃鈴玲 學生: 林慶南(工業工程與科技管理所)
08 CSS 基本語法 8-1 CSS 的演進 8-2 CSS 樣式規則與選擇器 8-3 連結HTML 文件與CSS 樣式表
第13章 物件導向與例外處理 13-1 物件導向的基礎 13-2 類別與物件 13-3 類別的繼承 13-4 PHP的例外處理
Part 2 開發Android應用程式的流程
第一章 面向对象程序设计.
第11章 過載與多形 11-1 方法的過載 11-2 運算子的過載 11-3 再談抽象類別與介面 11-4 多形的基礎 11-5 實作多形.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
類別的繼承-一般關係: 繼承是宣告的類別繼承現存類別的部份或全部的成員資料和方法 , 新增額外的成員資料和方法或覆寫和隱藏繼承類別的方法
Ch07 介面與多重繼承 物件導向程式設計(II).
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
手持式裝置之隨身照護應用 Android開發環境設定 鐘國家 老師.
實驗四:單位轉換程式.
Ch08 巢狀類別 物件導向程式設計(II).
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第十一章 結構.
LINQ 建國科技大學 資管系 饒瑞佶.
Java簡介.
Ch06 再談選單元件 物件導向系統實務.
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
客戶端的檔案上傳 HtmlInputFile檔案控制項 上傳單一檔案 同時上傳多個檔案.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
串列(List) 撰寫一串列程式.
Android + Service 建國科技大學 資管系 饒瑞佶.
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
第9章 類別圖與物件圖 9-1 類別圖與物件圖的基礎 9-2 類別圖的符號 9-3 類別關係 9-4 物件圖 9-5 繪製類別圖與物件圖
程式設計(二) 進階類別 郭文真 Sabrina Kuo.
類別的繼承 Vehicle Car.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
Php class 組員: 賴羿陵 林昱廷 莊正暉 張雅晴
Topic Introduction—RMI
第一單元 建立java 程式.
Ch20. 計算器 (Mac 版本).
第 19 章 XML記憶體執行模式.
雲端計算.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
C qsort.
MicroSim pspice.
OOP9 類別Class.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
陣列與結構.
Dreamweaver 進階網頁製作 B 許天彰.
第二章 Java基本语法 讲师:复凡.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
Quiz1 繳交期限: 9/28(四).
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
第2章 Java语言基础.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
SQLite資料庫 靜宜大學資管系 楊子青.
Chapter 4 Multi-Threads (多執行緒).
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

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

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

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

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

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

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

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

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

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編碼。

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

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>

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

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

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

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

4-1-4 XML文件的命名空間 – 在Android的XML檔使用的命名空間 在Android專案定義資源是使用XML文件內容的檔案,其根元素需要宣告命名空間來識別是Android系統的屬性,例如:宣告使用介面的XML檔activity_main.xml,其內容如下所示: <LinearLayout xmlns:android= http://schemas.android.com/apk/res/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" android:text="@string/hello" /> </LinearLayout>

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

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

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

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

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

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; }

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; }

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

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

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

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

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

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

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)

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();

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; } ……….. }

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

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

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

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

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

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

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

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

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

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

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

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

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; } }

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

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

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

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

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

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

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

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

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

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。

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()方法更改顯示的內容。

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

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

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

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;

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

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

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

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

實作 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();

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();

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

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

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

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

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

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,現在我們只需呼叫此介面的方法,就可以依序走訪和刪除元素。

End